Jun 9 2013
Управление доступом в Yii Framework на основе ролей (RBAC)
Yii Framework поддерживает управление доступом на основе ролей (RBAC – Role Based Access Control). В посте хочу описать способ управления доступом, в котором роли будут описаны в PHP-файле, а правила доступа будут задаваться через метод класса контроллера:
public function filters();
Сначала необходимо указать приложению, что мы будем использовать компонент authManager, для этого в секции ‘components’ конфигурационного файла пропишем следующее:
'authManager'=>array( 'class'=>'PhpAuthManager', 'defaultRoles'=>array('guest'), ),
PhpAuthManager – это имя файла (класса), расширяющего класс CPhpAuthManager – менеджер авторизации, который хранит информацию в php-файле, путь к которому хранится в свойстве authFile. Класс PhpAuthManager содержит следующий код:
class PhpAuthManager extends CPhpAuthManager{ public function init(){ // Иерархию ролей расположим в файле auth.php в директории config приложения if($this->authFile===null){ $this->authFile=Yii::getPathOfAlias('application.config.auth').'.php'; } parent::init(); // Для гостей и так роль по умолчанию guest. if(!Yii::app()->user->isGuest){ // Связываем роль, заданную в БД с идентификатором пользователя $this->assign(Yii::app()->user->role, Yii::app()->user->id); } } }
В файле auth.php описываются роли, при этом возможно использование наследования, что бы расширять роли:
return array( 'guest'=>array( 'type'=> CAuthItem::TYPE_ROLE, 'description'=>'Guest', 'bizRule'=>null, 'data'=>null, ), 'manager'=>array( 'type'=> CAuthItem::TYPE_ROLE, 'description'=>'Manager', 'children'=>array( 'guest', ), 'bizRule'=>null, 'data'=>null, ), 'zamdirect'=>array( 'type'=> CAuthItem::TYPE_ROLE, 'description'=>'Zamdirector', 'children'=>array( 'manager', ), 'bizRule'=>null, 'data'=>null, ), 'direct'=>array( 'type'=> CAuthItem::TYPE_ROLE, 'description'=>'Director', 'children'=>array( 'zamdirect', ), 'bizRule'=>null, 'data'=>null, ), );
В классах, описывающих контролеры в методе public function filters() указываем имя метода, в котором будут описаны правила доступа:
public function filters() { return array( 'accessControl', ); }
Задаём правила доступа к методам класса
public function accessRules() { return array( array('allow', 'actions'=>array('index','view','group','create','update'), 'roles'=>array('manager'), ), array('allow', 'actions'=>array('delete'), 'roles'=>array('zamdirect'), ), array('deny', // deny all users 'users'=>array('*'), ), ); }
Если права доступа не будут заданы, подразумевается, что доступ не ограничен.
Для того что бы хранить роли в базе данных используется класс CDbAuthManager.
Пожалуй на этом всё.
Jul 12, 2013 @ 19:08:55
Идеальнее производить проверки не по самим ролям, а по разрешённым задачам, а в роли уже наследовать эти задачи. Тогда будет возможно компоновать роли и задачи друг с другом, например как http://www.elisdn.ru/blog/22/gibkaia-nastroika-razreshenii-dlia-rolei-rbac
Jul 13, 2013 @ 19:19:08
Согласен. В статье продемонстрировано управление ролями, а уж как оно будет применено зависит от фантазии разработчика.