CakePHP 2.1如何在启用安全组件的情况下进行jQuery Ajax调用

10

终于找到了解决方案:

如果有人遇到这个问题,请将以下内容放入您的beforefilter中。

$this->Security->unlockedActions = array('givestar');

并更新libs到Cake 2.3

问题:

我在处理ajax调用时遇到安全组件黑洞的问题。

var id = 1;

$.ajax({
    type: "post",
    url: "/messages/givestar/",
    data: {"id" : id},
    dataType: "json"
 });

我只是想发送ID给控制器,以便更新ID=id的消息。

但安全组件在所有我的ajax调用中都将我黑洞化。

有人知道如何在激活安全组件的情况下使其工作吗?

谢谢!

你很棒!

-汤姆

有建议吗???

更新2:经过一些测试,我从黑洞处获得了AUTH错误。

From Book: 
‘auth’ Indicates a form validation error, or a controller/action mismatch error.

我已经仔细检查了所有的ACO节点,它们都很好。我怀疑在我的ajax调用中,安全组件产生了表单验证错误。

更新:

AppController.php

public $components = array(
        'Acl',
        'Auth',
        'Session',
    'Security',
    'Cookie'
    );
public function beforeFilter() {
    $this->Security->blackHoleCallback = 'blackhole';
}
public function blackhole($type) {
     $this->Session->setFlash(__('ERROR: %s',$type), 'flash/error');
}

MessagesController.php

 public $components = array('RequestHandler');

        public function beforeFilter() {
            parent::beforeFilter();
        }

public function givestar() {
        $this->autoRender = false;
            if ($this->request->is('ajax')) {

                echo 'Working';
            }
        return;
    }

安全组件已激活?意味着您想加密id还是在ajax调用中隐藏它? - coolguy
http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html - Tom
啊,我的错。我不是Cake PHP的人,我使用Zend框架+JQuery。在Stack Overflow上有很多Cakephp专家,你很快就能找到你需要的了 :) - coolguy
我不想加密任何东西,但安全组件正在保护每个POST免受篡改。我已经了解了序列化ajax调用并使用json来解决这个问题,但我不确定如何做...无论如何还是谢谢 :) - Tom
2个回答

7
在 beforeFilter 中:
$this->Security->unlockedActions = array('givestar');

2

安全组件第396行:

if (!isset($controller->request->data['_Token'])) {
    if (!$this->blackHole($controller, 'auth')) {
        return null;
    }
}

所以,如果您想保护此操作,您必须使用额外生成的“_Token”键发送数据。该键是使用Form->secure($fields)方法生成的(实际上,该方法生成带有正确值的隐藏输入)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接