我们知道如何中控制器中关闭csrf验证;
public $enableCsrfValidation=false;
那如果,需要关闭控制器某些方法的csrf验证该如何处理呢?
控制器都继承 yii\web\Controller的话,那么你可以在该控制器下如下操作
class PublicController extends Controller
{
private $exceptRoute=['upload','del-pic'];//自己定义不需要验证csrf的路由
//重写该父类方法
public function beforeAction($action)
{
/**
* 如果该路由不在 $this->exceptRoute中,则验证csrf
*/
if (!in_array($action->id,$this->exceptRoute)) {
return parent::beforeAction($action);
}
return true; // TODO: Change the autogenerated stub
}
}
我们来看父类beforeAction干了什么,就是验证csrf;
/*父类方法*/ 验证csrf
public function beforeAction($action)
{
if (parent::beforeAction($action)) {
if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {
throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.'));
}
return true;
}
return false;
}