Точная проблема и решение
После активации компонента 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' ...
Может кто-нибудь объяснить, что я могу сделать по этому поводу? Я не нахожу много информации об этом ..
Спасибо!