Может ли ACL разрешить все, но запретить для одного?

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

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

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

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

Спасибо.


person Rob Wilkerson    schedule 09.09.2011    source источник


Ответы (1)


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

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

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

Небольшой тангенс:

Вот где я полагаю, путаница может лежать. Структура вашего ACL [ACOs и AROs] — это просто имена узлов, которые в целом соответствуют структуре вашего контроллера/настройки действия, но могут называться любым именем по вашему желанию, поскольку разрешения проверяются в каждом действии. 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, которая соответствует контроллеру/действию: Разрешения пользователей и ACL CakePHP.

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

person Anthony    schedule 03.10.2011