我尝试使用ajax POST
请求发送数据,但即使我向匿名用户(['actions' => ['update', 'test'], 'allow' => true]
)授权该方法,我也总是会重定向到登录页面。当我使用GET请求进行测试时没有问题。
我的控制器:
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
['actions' => ['update', 'test'], 'allow' => true],
],
],
];
}
public function actionTest() {
Yii::$app->request->enableCsrfValidation = false;
echo 'ok';
}
我使用Postman来测试请求
答案 0 :(得分:1)
您使用的解决方案实际上不是解决方案,如果您无法使用密钥打开锁定就可以解除锁定。
如果您在没有发送CSRF参数的情况下发出Ajax Post请求,那么大多数情况下都会获得400 Bad Request
,我从未遇到像重定向到登录页面那样的问题。
但是如果通过禁用CSRF验证来解决您的问题,那么您应该在进行任何ajax请求时遵循此方法。
在您的配置中,您可以使用csrfParam
组件中的request
来定义csrf参数名称
'request' => [
'csrfParam' => '_csrf-app',
],
如果已定义,则可能会有所不同。
您必须在ajax请求中使用_csrf-app
值发送此参数csrf
以及您的post
数据。并且为了检索csrf的值,您可以使用javascript yii.getCsrfToken()
方法,或Yii::$app->request->csrfToken
,如果通过php
查看。
如果您的脚本位于视图文件中,请参阅此示例调用您可以硬编码参数_csrf-app
的名称或使用Yii::$app->request->csrfParam
。
$.ajax({
url:'/add',
data:{'_csrf-app':yii.getCsrfToken()}
success:function(data){}
});
希望这能解决你的问题。
答案 1 :(得分:0)
lubosdz的建议解决了这个问题
修改后的控制器:
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
['actions' => ['update', 'test'], 'allow' => true],
],
],
];
}
public function beforeAction($action) {
if ($action->id == 'test') {
$this->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
public function actionTest() {
echo 'ok';
}
答案 2 :(得分:0)
我找到了一个看起来有点像Muhammad Omer Aslam的解决方案:通过在JavaScript中序列化表单,我可以直接发送所有字段和ActiveForm生成的csrf令牌。
$.ajax({
url: ...,
type: 'POST',
data: $('#myForm').serialize(),
success: (response) => { ... }
})