Торт PHP 3.8. Компонент безопасности - FormHelper end () метод - 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.

Все работало нормально, пока я не загрузил Component в свой AppController.

If (!$this->request->is('ajax')) {

    $this->loadComponent('Security');

}

Мои формы работали нормально, но после активации компонента я получаю сообщение об ошибке. Очевидно, использование компонента безопасности проверяет наличие дополнительного токена помимо токена csrf.

'_Token' was not found in request data.

Я нашел решение в настройке метода Form-> end ().

"Метод end () закрывает и завершает форму. Часто end () выводит только закрывающий тег формы, но использование end () является хорошей практикой, поскольку позволяет FormHelper вставлять скрытые элементы формы, которые требуются Cake \ Controller \ Component \ SecurityComponent. "

Я настроил свой метод завершения, как предложено в документации:

echo $this->Form->end(['data-type' => 'hidden']);

Но мой вывод в HTML отличается из вывода в документации ..

Вывод документации:

<div style="display:none;">
    <input type="hidden" name="_Token[fields]" data-type="hidden"
        value="2981c38990f3f6ba935e6561dc77277966fabd6d%3AAddresses.id">
    <input type="hidden" name="_Token[unlocked]" data-type="hidden"
        value="address%7Cfirst_name">
</div>

Пример нерабочей формы ..

    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();

Мой вывод содержит только одну скрытую поле, для '_csrfToken' ...

Может кто-нибудь объяснить, что я могу сделать по этому поводу? Я не нахожу много информации об этом ..

Спасибо!

...