Yii2. AccessControl не работает при указанном beforeAction.


Сегодня столкнулся с ситуацией, когда в случае переопределенного beforeAction не срабатывали правила доступа accessControl. Проблему быстро решил, но думаю я не один, кто с ней сталкивался — поэтому напишу решение.

Итак, мой метод имел следующий вид:

    public function beforeAction($action)
    {
        if( !\Yii::$app->user->isPrivateSessionActive() ) {
            $this->redirect(['/auth/']);
        }
        return true;
    }

Пока пользователь был авторизован — всё было хорошо, но когда сессия истекла — получили ошибку об ошибке доступа к несуществующему методу — т.к. \Yii::$app->user->identity === null.

Пояснение к возникшей ситуации есть в документации.

Выход, как следствие, должен выглядеть так:

    public function beforeAction($action)
    {
        if( !parent::beforeAction($action) ){
            return false;
        }
        if( !\Yii::$app->user->isPrivateSessionActive() ) {
            $this->redirect(['/social-box/common/private-auth/']);
        }
        return true;
    }

Т.е. важно сначала запустить всю цепочку обработчиков beforeAction, где как раз и отработает проверка на права доступа accessControl. В случае, если проверка неуспешна — мы возвращаем false. Если же всё хорошо — тогда можем смело выполнять нашу логику.

Если Вам интересен вопрос редиректа в методе beforeActionздесь Вы можете посмотреть короткую статью по этому вопросу.

На этой всё — если остались вопросы — добро пожаловать в комментарии. Удачи, друзья.

, ,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *