Судя по вашей таблице aro_aco, похоже, что это правильное поведение. User.4 принадлежит к группе администраторов, у которой есть разрешение на обновление. установите значение true в строке 8. У вас есть правило в строке 8 специально для User.4, но вы предоставили разрешение на обновление именно этому пользователю в этой строке. Похоже, что правила ACL работают именно так, как вы их настроили. Чтобы User.4 не использовал разрешение на обновление, запустите его в командной строке cake, чтобы обновить ваши правила для User.4:
cake acl deny User.4 House.1 update
При запуске проверки он должен вернуть false:
cake acl check User.4 House.1 update
EDIT
Я попытаюсь пересмотреть это на основе комментариев, оставленных ниже. Я думаю, что вы все еще можете устанавливать правила неправильно. Я собираюсь использовать примеры командной строки (потому что это либо для типа, и для практики), но вы можете так же легко написать PHP для этого. Мои примеры, приведенные ниже, также посвящены администрированию, но вы также можете использовать его для групп суперадмина и пользователей.
Во-первых, запретите все для администраторов, поскольку мы хотим предоставлять разрешения индивидуально:
cake acl deny admin Houses all
Затем предоставьте администратору разрешение только на чтение, чтобы все они могли читать Дома:
cake acl grant admin Houses read
Наконец, предоставьте разрешение на обновление конкретному пользователю, который получает права на обновление:
cake acl grant User.4 Houses.1 update
Эти разрешения должны позволять User.4 читать и обновлять запись House. Помните, что если вы уже создали записи deny или allow для User.4, этот пример может не сработать. Возможно, вы захотите обрезать свою таблицу aco_aro и начать все сначала, так как в этот момент она мала.
Если все проверки ACL работают, но поведение по-прежнему некорректно, у вас может возникнуть проблема с тем, как компонент ACL авторизует действие. Возможно, вам придется настроить эти параметры в $ beforeFilter или в массиве $ компоненты.