关于如何在单独的 action 中关闭 Csrf 验证 [ 技术分享 ]
由于Yii2
Controller
Csrf
验证是在beforeAction
中完成的,所以在action
中指定
$this->enableCsrfValidation = false;
不能实现局部关闭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
中关闭。
共 6 条回复
-
beforeAction里面这样应该也是可以的吧?
public function beforeAction($action) { $this->enableCsrfValidation = false; return parent::beforeActin($action); }
共 6 条回复huaixiaoya 回复于 2015-07-20 14:00 回复这样写是关闭了controller 里面验证
if(in_array($action, $this->actions)){ $this->controller->enableCsrfValidation = false; }
恩,我的意思是把
parent::beforeAction
放在设置enableCsrfValidation
属性的后面,这里,你同样可以用in_array
进行判断是否设置enableCsrfValidation
不是么?xixihaha123 回复于 2015-08-10 20:10 回复@yiissy001 :请问一下,在yii 1中能用上面的方法?
@xixihaha123 好像不行
-
sevenyearsold 回复于 2015-07-17 22:51 举报
好使!赞一个。
-
ljx492049007 回复于 2015-07-21 14:54 举报
good 点赞
-
其实 本质都是借助beforeAction事件 做处理, 当然了 结合behavior 更简洁, 更易于复用, 更符合开闭原则什么的...不过也带来一点点点点可以忽略不计的效率问题
KillMeAgain 觉得很赞
KillMeAgain Lanzhou
注册时间:2014-12-15
最后登录:2017-10-11
在线时长:16小时17分
最后登录:2017-10-11
在线时长:16小时17分
- 粉丝4
- 金钱405
- 威望20
- 积分765