Права доступа

гемоглобин

Новичок
Поделитесь, как элегантно проверять права доступа к редактированию статьи. К примеру статью может редактировать ее автор и еще модератор и суперадмин.
Круче всего было бы в результате получить что-то такое: $user->isAllowed('edit', $article). Ведь user уже знает свою роль, свой id, и т.д.
Но уж больно много user должен знать обо всех объектах.
Я подумываю о том, чтобы ему в конструктор какой-нибудь $acl пихать, как вы думаете, это приемлемо? И как лучше это реализовать?
 

гемоглобин

Новичок
Возможно я ошибаюсь, но это какой-то процедурный подход. Т.е. везде, где мне нужно прочекать права, надо помимо объекта user, таскать еще и объект $acl
Но это наверно не так важно. Непонятно другое, что же должно происходить внутри этой isAllowed.
Как понять, что для статей надо проверять, является ли юзер ее автором, а для добавления пользователей просто проверять админ или нет. Не понимаю как это сделать универсально
 

Mols

Новичок
гемоглобин
Это как раз не процедурный подход.
В такой модели минимизируется связанность классов, а привилегии хранятся более менее централизованно.
Но никто не мешает сделать метод ->isAllowed('action_name', $user) в корневом классе модели и проверять его результат здесь $acl->isAllowed('edit', $user, $article); проверять в том случае если более общие правила не дали однозначного разрешения. (Ну и соответственно переопределять ->isAllowed('action_name', $user) там, где это необходимо.)
а вообще вот http://framework.zend.com/manual/ru/zend.acl.html
 

Yuriy_S

-=PHP-Club=-
ShVad

это несколько не централизованно..
Почему бы не хранить где-то (например в базе) список привилегий или ролей для пользователей, групп, распределить это все по типам, например модуль (moduleID), и в методе isAllowed уже проверять полученные в качестве аргументов данные (тип, экшен, айди, юзер) на наличие в этом списке? Список (карту) привилегий можно загружать куда-то (сессия, какой-либо кэш) при авторизации пользователя, да бы не дергать туже базу при каждом обновлении страницы.
 

Yuriy_S

-=PHP-Club=-
ShVad
я понимаю, что простой пример, но лучше так не делать:)
 
Сверху