确切的问题和解决方法
在激活CakePHP(3)安全组件时,在加载表单时,您会在表单中生成三个隐藏字段。它们是“ _Token [fields]”,“ _ Token [unlocked]”和“ _Token [debug]”。确切的情况是,当请求数据包含['Token']参数时,Form-> end()方法将调用secure()方法(请参阅FormHelper)。
不适用于我的表单都是作为元素呈现的表单。对于这些形式,“ $ this-> request-> params”不包含安全组件通常生成的参数。
解决方案是将参数手动添加到请求数据中。
$this->request->params['_Token'] = ['unlockedFields' => []];
这将通过FormHelper的secure()方法运行,并正确添加了令牌参数。
原始问题
我在使用CakePHP 3.8的SecurityComponent时遇到问题。
一切正常,直到我在AppController中加载了Component。
$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。