Задать вопрос
MacFiss
@MacFiss
человек

Автоматическая проверка permission?

Здравствуйте, подскажите пожалуйста. Настраиваю rbac таким образом, что бы каждый пользователь имел помимо роли, еще отдельное разрешение к какому нибудь экшену.

Есть ли вариант автоматизировать проверку разрешений, нежели писать ее в каждой функции экшена?
if( ! Yii::$app->user->can('nameAction') ) {
     return false;
}
  • Вопрос задан
  • 137 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
qonand
@qonand
Software Engineer
если Вы в каждом экшене проверяете с помощью can, для решения этой проблемы есть два варианта:
1. Проверять доступ к экшену с помощью AccessControl на уровне контроллера/модуля, например:
public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['index'],
                    'roles' => ['nameAction'], // тут указываем название Permission
                ],
            ],
        ],
    ];
}

этот вариант конечно не особо автоматизирует проверку т.к. все равно вручную необходимо прописывать какому экшену какой Permission соответствует, но зато делает код менее зависимым.
2. Проверять доступ к экшену до выполнения экшена на уровне beforeAction контроллера (или его родителя), например:
public function beforeAction($action)
{ 
    if (parent::beforeAction($action) === false) {
        return false;
    }
    if (Yii::$app->user->can($this->module->id . '.' . $this->id . '.' . $action->id)) {
        return true;
    } else {
        throw new \yii\web\ForbiddenHttpException();
    }    
}

Соответственно при таком подходе Permission должны иметь названия в формате "<название модуля>.<название контроллера>.<название экшена>"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы