Отключить проверку CSRF для отдельных действий в Yii2
Есть ли способ отключить проверку CSRF для некоторых действий контроллера, если он включен для других?
В моем случае у меня есть несколько настраиваемых классов Action, которые предназначены для ввода в контроллеры. Я не могу передать токен проверки csrf в запрос AJAX, потому что то, с чем я работаю, является внешним (сделанным не мной) плагином WYSIWYG во внешнем интерфейсе. Да, я все еще могу отключить проверку csrf всего контроллера с помощью этих действий, но это может быть небезопасно.
Ответы
Ответ 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;