yii2框架为了安全,对所有控制器的Post提交都做了csrf验证。这固然很好,但是有时我们却需要关闭它,比如在做微信等接口回调出理时,就需要关闭csrf,不然获取不到数据。 当然,可以直接在控制器加public $enableCsrfValidation = false;整个控制器关闭csrf验证,但这样做的也有弊端,就是所有动作都不验证,这是很危险的,当一个控制器中有的动作需要csrf验证,有的不需要时, 我们就需要借助行为来实现。

1,新建行为,命名空间可根据自己的情况来写,示例如下:

  1. <?php
  2. namespace common\behaviors;
  3. use Yii;
  4. use yii\base\Behavior;
  5. use yii\web\Controller;
  6. /**
  7. * 局部关闭csrf验证
  8. * @author xiaomalover <xiaomalover@gmail.com>
  9. */
  10. class NoCsrfBehavior extends Behavior
  11. {
  12. /**
  13. * 不验证动作数组
  14. * @var array
  15. */
  16. public $actions = [];
  17. /**
  18. * 给控制器的EVENT_BEFORE_ACTION事件绑定处理器
  19. */
  20. public function events()
  21. {
  22. return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
  23. }
  24. /**
  25. * beforeAction事件处理函数
  26. * @param Event $event 事件实体
  27. */
  28. public function beforeAction($event)
  29. {
  30. $action = $event->action->id;
  31. if (in_array($action, $this->actions)) {
  32. $this->owner->enableCsrfValidation = false;
  33. }
  34. }
  35. }

2,在控制器里如下引用:

  1. <?php
  2. namespace frontend\controllers;
  3. use yii;
  4. use yii\web\Controller;
  5. use common\behaviors\NoCsrfBehavior;
  6. class SiteController extends Controller
  7. {
  8. /**
  9. * 增加局部关闭crsf行为
  10. * @author xiaomalover <xiaomalover@gmail.com>
  11. */
  12. public function behaviors()
  13. {
  14. return [
  15. 'csrf' => [
  16. 'class' => NoCsrfBehavior::className(),
  17. 'actions' => [
  18. 'wx-back'
  19. ]
  20. ]
  21. ];
  22. }
  23. }

如此以来,只要在actions里的动作,都会自动关闭csrf验证。

分类: web

标签:   yii2