加载SecurityComponent时CakePHP 3.8问题

时间:2020-04-06 11:53:31

标签: ajax security cakephp cakephp-3.x

确切的问题和解决方法

在激活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。

enter image description here

0 个答案:

没有答案