Как лучше всего справиться с этой сложной ситуацией ACL, используя CakePHP? - PullRequest
3 голосов
/ 27 июня 2011

Я делаю небольшое приложение для обработки информации, связанной с проектом, и у меня проблемы с ACL. Как мне лучше всего справиться со следующей ситуацией?

Мое приложение имеет следующие таблицы:

users : Сохраняет информацию о пользователях (имя пользователя, пароль, адрес электронной почты, группа и т. Д.)

groups : Группы, к которым принадлежат пользователи. У меня есть «администраторы», «менеджеры» и «зарегистрированные»

роли : роли для зарегистрированных пользователей. У меня есть «лидер», «участник» и «гость».

членство : в этой таблице хранятся отношения между пользователями, ролями и проектами.

projects : Хранит информацию о проектах

пунктов : Проекты имеют несколько информационных элементов. В этой таблице хранятся эти предметы.

Таблицы имеют следующие отношения:

пользователи : имеет много участников, принадлежит к группам.

группы : hasMany пользователей

ролей : имеет много участников

членство : принадлежит пользователям, проектам, ролям

проектов : имеет много участников, предметы

предметов : принадлежит проектам

Обычно менеджеры (или администраторы) могут назначать роли зарегистрированным пользователям. Лидеры и участники могут принадлежать к нескольким проектам. Те, кто принадлежит конкретному проекту, могут редактировать данные этого проекта и связанные с ним элементы. Лидеры могут назначать участников проекта из пула зарегистрированных пользователей.

Вот ситуация с точки зрения CRUD:

Администраторы : Полный CRUD для всего (пользователей, участников, проектов, предметов)

Менеджеры : Могут пользователи CRUD типа «зарегистрированные», но не «менеджеры» или «администраторы». Полный CRUD на членство, проекты и предметы.

зарегистрирован : может делать разные вещи в зависимости от их роли:

лидеров (роль) : может обновлять свою собственную информацию пользователя и читать другие пользовательские данные, которые принадлежат их проектам (информация, хранящаяся в таблице «членство»). Можно CRUD членство для своих проектов. Можно CRUD предметы для собственных проектов. Можно обновлять собственные проекты.

участников (роль) : Может обновлять свою собственную информацию о пользователе и читать другие пользовательские данные, которые принадлежат их проектам. Можно CRUD предметы для собственных проектов. Можно читать членство для своих проектов. Можно обновлять собственные проекты.

гости (роль) : могут обновлять свою собственную информацию о пользователе. Умею читать проекты.

Исходя из вышеизложенной ситуации, что, по вашему мнению, будет лучшим подходом для ее решения? Я пытался с ACL, но где-то на пути я потерял. Я попытался поиграть с некоторыми из доступных плагинов ACL, но безуспешно. Самая большая проблема - иметь дело с созданием разрешений менеджерами и администраторами. Пожалуйста, помогите!

Я еще не адепт-пекарь, так что будьте добры. Ваши предложения и рекомендации будут с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 03 июля 2011

Да, ACL Cake может быть сложным.Я не могу дать вам пошаговое объяснение того, как решить вашу проблему, но, возможно, я могу помочь вам с общей картиной.Я предлагаю вам взглянуть на пример приложения Cake для документов ACL - может быть, вы читаете только документацию на AclComponent ?Эта часть документов может быть немного запутанной.

Я думаю, что вам нужно немного изменить структуру базы данных, чтобы она стала "способом ACL":

  1. Вместо таблицы roles используйте вложенные группы (вставьтеparent_id столбец в таблице groups).
  2. Вам также не нужен стол membership.Для этого в ACL есть таблица aros_acos.
  3. Вы управляете группами как ARO s.Контроллерами для проектов и элементов (или определенных действий на этих контроллерах) являются ACO s.
  4. Если вы правильно настроили ACL (отметьте this ), контроллеры и модели управления пользователями (User, Group, UsersController, GroupsController) "магически" позаботятсяведения таблицы aros.
  5. К сожалению, с ACO s и таблицей acos все не так просто.Вы должны решить, как управлять ими (см. здесь и раздел после этого).
  6. В вашем методе AppController::beforeFilter вы используете методы allow и deny компонента ACL, чтобы предоставить или запретить доступ к текущему контроллеру / действию ($this->name, $this->action)

Я полагаю, что вы почти у цели, это не должно быть сложно, как только вы привыкнете к ACL Cake.

...