Yii2: пост-запрос ajax всегда перенаправляет на страницу входа - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь отправить данные с помощью запроса 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';
}

Я использую Почтальон для проверки запросов

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Решение, которое вы использовали, на самом деле не является решением, оно похоже на то, что если вы не можете открыть замок с помощью ключа, просто снимите замок.

В основном вы получаете 400 Bad Request, если вы делаете запрос Ajax Post без отправки параметров CSRF, я никогда не сталкивался с такой проблемой, как перенаправление на страницу входа.

Но если ваша проблема решена путем отключения проверки CSRF, вы должны следовать этому методу при выполнении любых запросов AJAX.

В вашей конфигурации вы определяете имя параметра csrf, используя csrfParam в компоненте request, подобном этому

'request' => [
     'csrfParam' => '_csrf-app',
],

Это может отличаться для вас, если оно уже определено.

Вы должны отправить этот параметр _csrf-app со значением csrf в запросе ajax вместе с вашими данными 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){}
});

Надеюсь, это решит вашу проблему.

0 голосов
/ 09 мая 2018

Я нашел решение, которое немного похоже на ваше Мухаммед Омер Аслам : сериализовав форму в JavaScript, я могу отправлять напрямую все поля и токен csrf, сгенерированный ActiveForm.

$.ajax({
    url: ...,
    type: 'POST',
    data: $('#myForm').serialize(),
    success: (response) => { ... }
})
0 голосов
/ 07 мая 2018
Предложение

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';
}
...