Подтвердить что ты не робот

Отключить проверку CSRF для отдельных действий в Yii2

Есть ли способ отключить проверку CSRF для некоторых действий контроллера, если он включен для других?

В моем случае у меня есть несколько настраиваемых классов Action, которые предназначены для ввода в контроллеры. Я не могу передать токен проверки csrf в запрос AJAX, потому что то, с чем я работаю, является внешним (сделанным не мной) плагином WYSIWYG во внешнем интерфейсе. Да, я все еще могу отключить проверку csrf всего контроллера с помощью этих действий, но это может быть небезопасно.

4b9b3361

Ответ 1

Для конкретного контроллера/действий вы можете отключить проверку CSRF следующим образом:

use Yii;

...

Yii::$app->controller->enableCsrfValidation = false;

Или внутри контроллера:

$this->enableCsrfValidation = false;

Посмотрите $enableCsrfValidation свойство yii\web\Controller.

Update:

Вот некоторые спецификации.

Если вы хотите отключить проверку CSRF для отдельных действий, вам нужно сделать это в обработчике событий beforeAction, потому что токен CSRF проверяется перед запуском действия (в beforeAction от yii\web\Controller).

/**
 * @inheritdoc
 */
public function beforeAction($action)
{            
    if ($action->id == 'my-method') {
        $this->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}

Официальные документы:

Ответ 2

Поместите это в свой контроллер, просто замените index на любое действие, на котором вы хотите отключить csrf.

public function beforeAction()
{      
    if ($this->action->id == 'index') {
        $this->enableCsrfValidation = false;
    }
    return true;
}

Ответ 3

Для меня это то, что сработало

public function beforeAction($action) {
    if($action->id == 'my-action') {
        Yii::$app->request->enableCsrfValidation = false;
    }
    return parent::beforeAction($action);
}

Ответ 4

Я пробовал это, и он работал.

Перейдите к конкретному контроллеру и напишите его вверху.

public $enableCsrfValidation = false;