如何在控制器中为单个操作禁用身份验证?

时间:2019-04-28 14:29:30

标签: php controller yii2

我需要一个控制器动作才能公开使用,以便用户可以在不经过身份验证的情况下请求它。

public function behaviors() {

    return [
        'access' => [
            'class' => AccessControl::className(),
            'only'  => [ 'callback' ],
            'rules' => [
                [
                    'allow'   => true,
                    'actions' => [ 'callback' ],
                ],
            ],
        ],
    ];

}

我尝试了以下选项,但仍然收到Bad Request (#400)并重定向到登录页面。

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

我可能猜到您正在尝试发送POST请求。

默认情况下, Yii2 要求对所有帖子请求进行CSRF验证,您可能会得到类似的行为。

尝试使用以下代码将其禁用:

private $noAuthRoutes = ['callback'];

public function beforeAction($action)
 {
  if(in_array($action->id,$this->noAuthRoutes)) {
   $this->enableCsrfValidation = false;
  }
  return parent::beforeAction($action);
 }
public function behaviors() {

  return [
   'access' => [
    'class' => AccessControl::className(),
    'only'  => $this->noAuthRoutes,
    'rules' => [
     [
      'allow'   => true,
      'actions' => $this->noAuthRoutes,
     ],
    ],
   ],
  ];

}

希望这会有所帮助。

答案 1 :(得分:0)

您可以通过将以下行添加到访问数组来实现

       'except' => ['action'],

也喜欢这个

            [
                'allow' => true,
                'actions' => ['login', 'signup'],
                'roles' => ['?'],
            ],