Управление доступом в 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.

Пожалуй на этом всё.