yii2框架为了安全,对所有控制器的Post提交都做了csrf验证。这固然很好,但是有时我们却需要关闭它,比如在做微信等接口回调出理时,就需要关闭csrf,不然获取不到数据。 当然,可以直接在控制器加public $enableCsrfValidation = false;整个控制器关闭csrf验证,但这样做的也有弊端,就是所有动作都不验证,这是很危险的,当一个控制器中有的动作需要csrf验证,有的不需要时, 我们就需要借助行为来实现。
1,新建行为,命名空间可根据自己的情况来写,示例如下:
<?php
namespace common\behaviors;
use Yii;
use yii\base\Behavior;
use yii\web\Controller;
/**
* 局部关闭csrf验证
* @author xiaomalover <xiaomalover@gmail.com>
*/
class NoCsrfBehavior extends Behavior
{
/**
* 不验证动作数组
* @var array
*/
public $actions = [];
/**
* 给控制器的EVENT_BEFORE_ACTION事件绑定处理器
*/
public function events()
{
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}
/**
* beforeAction事件处理函数
* @param Event $event 事件实体
*/
public function beforeAction($event)
{
$action = $event->action->id;
if (in_array($action, $this->actions)) {
$this->owner->enableCsrfValidation = false;
}
}
}
2,在控制器里如下引用:
<?php
namespace frontend\controllers;
use yii;
use yii\web\Controller;
use common\behaviors\NoCsrfBehavior;
class SiteController extends Controller
{
/**
* 增加局部关闭crsf行为
* @author xiaomalover <xiaomalover@gmail.com>
*/
public function behaviors()
{
return [
'csrf' => [
'class' => NoCsrfBehavior::className(),
'actions' => [
'wx-back'
]
]
];
}
}
如此以来,只要在actions里的动作,都会自动关闭csrf验证。
搜索
标签
study
ab
amap
apache
apahe
awk
aws
bat
centos
CFS
chrome
cmd
cnpm
composer
consul
crontab
css
curl
cygwin
devops
di
docker
docker,docker-compose
ethereum
excel
fiddler
fluentd
framework
front-end
git
gitgui
github
glide
go
golang
gorm
grafana
gzip
ioc
item2
iterm2
javascript
jenkins
jsonp
kafka
laradock
laravel
larval
linux
liunux
log
mac
mac, wi-fi
macos
magento
mariaDB
minikube
mongoDB
msp
mysql
netbeans
nginx
nodejs
nohup
npm
nsq
php
php-fpm
php7
phpstorm
php扩展
Protobuf
python
redis
scp
server
shell
soap
socket
socket5
sql
sre
ssdb
ssh
ssl
study
sublime
swift
system
td-agent
uml
v2ray
vagrant
vagrnat
vim
vpn
vue
vue.js
webpack
webrtc
websocket
webtatic
windows
windows7
word
wps
xdebug
yarn
yii2
yum
zookeeper
世界国家
互联网
以太坊
分类
前端
小程序
打印机
排序算法
搞笑
权限
粤语
缓存
网络
虚拟机
视频
设计模式
项目管理
热门文章
友情链接