Cakephp 2.0 строка / уровень записи Acl - PullRequest
1 голос
/ 16 ноября 2011

Я бездельничаю со списками доступа cakephp 2.0, до сих пор я создал очень простой пример, следуя документации.

Я настроил таблицу пользователей и наиболее важные функции, такие как index, add, login ecc. и относится к таблице групп (каждый пользователь принадлежит группе).

Я также создал таблицу "домов", которая содержит различное содержимое (дома).

Тогда я настроил auth в сочетании с acl-компонентом в режиме crud, включая дерево aco и aro.

Пока все хорошо, пока все работает, я могу разрешить или запретить отдельные действия для каждого пользователя. Но мне нужен дополнительный контроль доступа, чтобы, например, пользователь мог управлять только конкретным домом. Поэтому я настроил aco для каждого дома, разрешил пользователю доступ только для чтения к домам и разрешил доступ для обновления только для нужного дома. Но это не сработает! Независимо от того, что я делаю .. я не получаю доступ к действию редактирования. Вот мои деревья:

Aco:
[1] Houses
  [5] House.1
  [6] House.2
[2] Users

Aro:
[1] superadmin
  [4] User.1
[1] admin
  [5] User.2
  [7] User.4
[3] customer
  [6] User.3

И, наконец, таблица aros_acos:

id  aro_id  aco_id  _create _read   _update _delete

4   1   1   1   1   1   1
5   1   2   1   1   1   1
6   2   1   1   1   1   1
7   3   1   0   1   0   0
8   7   1   -1  1   1   -1
9   7   5   1   1   1   1

На самом деле, если я попытаюсь сделать быструю проверку с помощью:

 var_dump($this->Acl->check(
array('model' => 'User', 
'foreign_key' => 4),
array('model' => 'House',
'foreign_key' => 1),
'update'));

Это возвращает истину!

Странно ... Я что-то не так делаю? Есть ли способ прилично отладить компонент acl (с информацией, которую acos и aros проверяет компонент, видя ecc.)?

1 Ответ

1 голос
/ 16 ноября 2011

Судя по вашей таблице 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 или в массиве $ компоненты.

...