Точная проблема и решение
После активации Cake PHP (3) Компонент безопасности, при загрузке формы вы создаете три скрытых поля в форме. Это '_Token [поля]', '_Token [разблокировано]' и '_Token [отладка]'. Что именно происходит, так это то, что метод Form-> end () вызывает метод secure () (см. FormHelper), когда данные запроса содержат параметр ['Token'].
Формы, которые не работали для меня, были всеми формами, представленными как Элемент. Для этих форм «$ this-> request-> params» не содержал параметр, обычно генерируемый Компонентом безопасности.
Решение было в том, чтобы вручную добавить параметр в данные запроса.
$this->request->params['_Token'] = ['unlockedFields' => []];
Это выполняется через метод secure () FormHelper, как и должно быть, и параметры токена добавляются правильно ,
Оригинальный вопрос
У меня возникла проблема с использованием SecurityComponent of Cake PHP 3.8.
Все работало нормально, пока я не загрузил Компонент в свой AppController.
$this->loadComponent('Security');
После нажатия кнопки я звоню ajax.
var csrf_token = <?php echo json_encode($this->request->getParam('_csrfToken')) ?>;
var checkouturl = "<?php echo $this->Url->build('/orders/checkout', true) ?>";
var test = "test";
$("#checkout").click(function() {
$.ajax({
type: 'post',
url: checkouturl,
headers: {'X-CSRF-Token': csrf_token},
data: {data : test},
success: function(result){
console.log(result);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr);
console.log(thrownError);
}
});
});
Этот вызов работал нормально, теперь я получаю следующее сообщение об ошибке (400 неправильных запросов). Очевидно, использование компонента безопасности проверяет наличие дополнительного токена помимо токена csrf.
'_Token' was not found in request data.
Может кто-нибудь объяснить, что я могу сделать по этому поводу? Я нахожу только информацию, связанную с формами, но это ajax звонок. Я хотел бы оставить компонент безопасности включенным.
Пример нерабочей формы ..
echo $this->Form->create($athlete, ['url' => ['controller' => 'Athletesux', 'action' => $action]]);
echo $this->Form->control('user_id', ['type' => 'hidden', 'value' => $userid]);
echo $this->Form->control('first_name');
echo $this->Form->control('last_name');
echo $this->Form->control('threek_time', ['value' => $athlete['3K_time']]);
echo $this->Form->control('fivek_time', ['value' => $athlete['5K_time']]);
echo $this->Form->control('tenk_time', ['value' => $athlete['10K_time']]);
echo $this->Form->select('country', $countryoptions);
echo $this->Form->select('gender', $gender);
echo $this->Form->button('Add Athlete');
echo $this->Form->end();
Спасибо!
HTML Генерировано ..