CakePHP: разрешения на основе модели? - PullRequest
2 голосов
/ 13 октября 2009

Борьба с решением о том, как лучше всего обрабатывать проверку подлинности на уровне клиента со следующей иерархией модели:

Клиент -> Магазин -> Продукт (персонал, оборудование и т. Д.)

... где у Клиента есть много магазинов, у магазина много продуктов (есть много сотрудников, есть много оборудования и т. Д.)

Я установил связь HABTM между пользователем и клиентом, которая является простой и доступной через сеанс аутентификации или статический метод в модели пользователя при необходимости (см. Описание afterFind ниже).

Прямо сейчас я колеблюсь между оценкой результатов в обратном вызове afterFind каждой модели, проверкой связи с Клиентом на основе модели, которую я запрашиваю у Клиентов, членом которых является текущий Пользователь. то есть, если текущей моделью является Клиент, проверьте идентификатор; если текущей моделью является Store, отметьте Store.clientid и, наконец, если Product, получите родительский Store из Item.storeid и соответственно отметьте Store.clientid.

Однако, чтобы соответствовать нормальному MVC, я возвращаю true или false из afterFind, а затем должен проверить возвращение из вызывающего действия - это нормально, но я никак не могу определить, как определить если Model-> find (или Model-> read и т. д.) возвращает false из-за неверного идентификатора в find или из-за разрешений клиента в afterFind; это также означает, что мне придется также изменять каждое действие.

Другой метод, с которым я играл, состоит в том, чтобы оценить запрос в app_controller.beforeFilter и, разбив запрос на controller / action / id, я могу затем запросить соответствующую модель (ы) и оценить поля по Массив Auth.User.clients для определения, имеет ли Пользователь доступ к запрошенному Клиенту. Это кажется нормальным, но не оставляет мне никакого способа (контроллера) для обработки / controller / index - кажется логичным, что результаты индекса будут отражать членство клиента.

Недостатки в обоих включают длинный список условных «правил», которые мне нужно разбить, чтобы определить, где находится текущая модель / действие / идентификатор в контексте клиента. В общем, оба чувствуют себя немного ломкими и запутанными для меня.

Есть ли третий вариант, на который я не смотрю?

1 Ответ

0 голосов
/ 14 октября 2009

Это звучит как работа для Cake ACL. Это что-то вроде кривой обучения, но как только вы это поймете, этот метод очень мощный и гибкий.

ACL-списки Cake (списки контроля доступа) позволяют сопоставлять пользователей с контроллерами до уровня CRUD (Create Read Update Delete). Зачем его использовать?

1) Код уже доступен для использования. AuthComponent уже имеет встроенный. 2) Он мощный и интегрированный, что позволяет вам контролировать разрешения для каждого действия на вашем сайте. 3) Вы сможете найти помощь от других разработчиков тортов, которые уже использовали его. 4) Как только вы настроите его в первый раз, будет намного проще и быстрее реализовать полные права доступа к сайту в любом другом приложении.

Вот несколько ссылок:

http://bakery.cakephp.org/articles/view/how-to-use-acl-in-1-2-x http://book.cakephp.org/view/171/Access-Control-Lists http://blog.jails.fr/cakephp/index.php?post/2007/08/15/AuthComponent-and-ACL

Или вы можете просто использовать Google для CakePHP ACL

...