在使用Yii2进行开发是,遇到一个提交的数据无法被验证的问题,这是因为yii2的防御csrf的攻击机制
解决方法在类中定义以下属性 public $enableCsrfValidation = false;
class ChannelController extends Controller
{
public $enableCsrfValidation = false;
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}
不过这是在类中关闭,还有一种是针对方法进行关闭,不过这种不太熟悉没有使用,以下来自https://www.yiichina.com/topic/5891
如何实现在方法中关闭csrf机制
新建一个Behavior
<?php
use Yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller;
class NoCsrf extends Behavior
{
public $actions = [];
public $controller;
public function events()
{
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}
public function beforeAction($event)
{
$action = $event->action->id;
if(in_array($action, $this->actions)){
$this->controller->enableCsrfValidation = false;
}
}
}
然后在Controller中添加Behavior
<?php
public function behaviors()
{
return [
'csrf' => [
'class' => NoCsrf::className(),
'controller' => $this,
'actions' => [
'action-name'
]
]
];
}
这样就实现了在action
中关闭Csrf
而不是在整个Controller
中关闭。