Контроль доступа Yii2

В шаблоне yii2 advanced по дефолту сделан AccessControl в бэкэнд части

 'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index','view','update','delete','word','confirmplatform','moderation-questionnaire','moderation-questionnaire-detail','cancelplatform','resend-email'],
                        'allow' => true,
                        'roles' => ['admin','moderator'],
                    ],
                ],
            ],

Как видно из правил, доступ в админку разрешён только admin и moderator.

Меня смущает то что если попытаться залогиниться в админку под аккаунтом с ролью user то yii пускает внутрь, экшен login отрабатывает. Только на экране мы видим 403 ошибку доступа.

Как сделать так чтобы при вводе "неправильных" аккаунтов просто перебрасывало на форму авторизации в админку с выводом ошибки?


Ответы (2 шт):

Автор решения: fedornabilkin

Надо заглянуть в AccessControl и посмотреть его поведение, когда доступ ограничен (когда 403 ошибка появляется). Затем создать свой бихевиор и унаследоваться от AccessControl. Переопределить тот метод, который отдает 403 ошибку, когда доступ запрещен и добавлять там в сессию ошибку, затем редиректить куда надо.

Как по мне, так 403 это корректная ошибка, если нет доступа.

→ Ссылка
Автор решения: binliz

Так чтобы было понятно:

'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            'actions' => ['login', 'error'],
            'allow' => true,
        ],
        [
            'actions' => ['logout', 'index','view','update','delete','word','confirmplatform','moderation-questionnaire','moderation-questionnaire-detail','cancelplatform','resend-email'],
            'allow' => true,
            'roles' => ['admin','moderator'],
        ],
    ],
    'denyCallback' => function($rule, $action) {
        Yii::$app->session->setFlash('info', 'ACCESS DENIDED!!!');
        return $action->controller->redirect('login');
    },
],
→ Ссылка