Как изменить поведение, которое заложено в beforeAction?

В Controller.php определен метод beforeAction() (YII2), который выкидывает эксепшн, если не проходит csrf валидация. Как изменить это поведение, мне бы хотелось, чтобы я оставался на странице аутентификации, но при этом появлялось всплывающее сообщение о не прошедшей валидации (при этом делать $this->enableCsrfValidation = false я не хочу). В моём контроллере делаю вот так:
public function beforeAction($action) {
        if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {
            Yii::$app->session->setFlash('info', 'Wasted');
            $this->redirect(['/']);
        }
        return parent::beforeAction($action);
    }

Разумеется, эксепшн продолжает ловиться.
  • Вопрос задан
  • 698 просмотров
Пригласить эксперта
Ответы на вопрос 2
qonand
@qonand
Software Engineer
csrf предназначается для защиты сайта от межсайтовой подделки запроса, соответственно если валидация не прошла - значит с большой вероятностью произошла подделка запроса, зачем в таком случае выводить всплывающее сообщение? Это не логично и бессмысленно.

Но если Вы все же хотите сделать вывод всплывающего сообщения тогда не изобретайте велосипед. Сделайте отправку формы аяксом, и на уровне JS проверяйте в ответе наличие исключения и уже в зависимости от того есть оно или нет - выводите всплывающее сообщение
Ответ написан
Комментировать
Tairesh
@Tairesh
Веб-программист
Читайте же, наконец, документацию! Всё давно придумано. Если вам не нужна CSRF-валидация достаточно выставить свойство контроллера $enableCsrfValidation в false. Но, конечно, нужно сто раз подумать, действительно ли вам она не нужна. Если вы просто делаете аякс-запросы, добавляйте к ним CSRF-токен, который можно добавить в форму через
<input name="<?=Yii::$app->request->csrfParam?" type="hidden" value="<?=Yii::$app->request->csrfToken?>">

или прямо в яваскрипте добавить в параметры запроса
var params = {
    // some params
};
params[yii.getCsrfParam()] = yii.getCsrfToken();
Ответ написан
Ваш ответ на вопрос

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

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