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
Согласен. В статье продемонстрировано управление ролями, а уж как оно будет применено зависит от фантазии разработчика.