Может ли ACL разрешить все, но запретить для одного? - PullRequest
2 голосов
/ 09 сентября 2011

Я унаследовал приложение, которое интенсивно использует ACL Cake - компонента, который я никогда не использовал - и настроено таким образом, что 3 групповых ARO имеют доступ ко всему контроллеру.ACO существуют для каждого действия в контроллере, но никакие разрешения явно не назначены на уровне действия.

Я сейчас столкнулся с ситуацией, когда мне нужна одна группа, чтобы иметь доступ к одному конкретному методу, но мне нужноотрицать это для других 2 групп.Есть ли способ, вместо того, чтобы явно назначать разрешения для каждой группы каждому действию, просто указать, что 2 группы не имеют разрешения для одного рассматриваемого действия?

По сути, яхотите сохранить текущий «доступ ко всему» по умолчанию, но переопределите его с помощью «запретить [это конкретное действие]».Я пробовал cake bake acl deny GroupName ControllerName actionName, но это, похоже, не оказывает никакого влияния.

В силу довольно повсеместной аналогии, я хотел бы, чтобы это вело себя как Apache AllowOverride.По умолчанию разрешить все для всех, но запретить данное действие для данной группы.Я не уверен, полезно ли это, но это так.

Спасибо.

1 Ответ

0 голосов
/ 03 октября 2011

Эта команда предоставит всем вашим ARO доступ к вашим ACO cake acl grant RootGroupName RootControllerName all.

После этого вы можете указать конкретные действия, которым вы хотели бы запретить доступ: cake acl deny GroupName ControllerName|AcoActionName AcoActionName|permissions

Если вашВторое значение после deny было AcoActionName, вам нужно будет использовать одно из следующих значений для разрешений: all, create, read, update, delete.

Небольшая касательная:

Вот где, я полагаю, может возникнуть путаница.Структура вашего ACL [ACO и ARO] - это просто имена узлов, которые обычно соответствуют структуре вашего контроллера / настройки действия, но могут называться любым именем, которое вы пожелаете, так как разрешения проверяются в каждом действии.ACL-списки CakePHP организованы в виде дерева (структура данных) , и внешние узлы могут иметь установленные разрешения CRUD на уровне базы данных.

Вот пример схемы ACL для пользователей и комментариев.

Aco tree:
---------------------------------------------------------------
  [1] controllers (root node)
    [2] Comments
      [3] edit
      [4] add
      [5] delete
---------------------------------------------------------------

Aro tree:
---------------------------------------------------------------
  [1] Groups (root node)
    [2] Users
    [3] Admin

---------------------------------------------------------------

Предполагая, что доступ предоставлен глобально, все Запрашивающие стороны имеют доступ ко всем Объектам.Если вы хотите отказать пользователям в возможности редактировать комментарии после того, как они отправили их, вы запустите cake acl deny Users Comments edit

. Вот отличное руководство по спискам ACL, в частности, код App_Controller в конце, в котором есть хороший фрагмент кода.которая проверяет разрешения для структуры ACO, которая соответствует контроллеру / действию: Права пользователя и CakePHP ACL .

Кроме того, в CakePHP Book есть хороший фрагмент для вставки всех ваших контроллеров / действий в качестве правил ACO: Автоматический инструмент для создания ACO

...