Торт PHP 3.8 выдает при загрузке SecurityComponent - PullRequest
0 голосов
/ 06 апреля 2020

Точная проблема и решение

После активации 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 Генерировано ..

enter image description here

...