2012-08-08 30 views
5

处理我的ajax调用secuity组件不会像他们应该的那样。Cakephp 2安全组件和ajax调用

如何在cakephp 2.x中处理它?

Appcontroller.php

public function beforeFilter() { 
     $this->Security->blackHoleCallback = 'blackhole'; 
     if ($this->request->is('ajax')) { 
      $this->Security->validatePost = false; 
     } 

似乎不工作...

回答

3

您仍然可以使用Cake的形式提供的安全机制的安全Ajax调用。 要做到这一点,渲染一个不可见的窗体并放置输入来存储ajax调用参数。然后,用JavaScript在表单中设置这些参数并通过序列化来完成ajax调用。请记住,如果您启用了CSRF检查(并且每会话一个令牌被禁用),则必须使用新的有效CSRF令牌更新该表单(可以使用$this->request->params['_Token']['key']在控制器中读取该令牌)。

实施例:

<?php 
    echo $this->Form->create('AjaxForm'); 
     echo $this->Form->hidden('value'); 
    echo $this->Form->end(); 
?> 

<script>  
    function makeAjaxCall() { 
     $.post(
      ajaxUrl, 
      $('#AjaxForm').serialize(), 
      function(data) { 
       $('#AjaxForm [name="data[_Token][key]"]').val(data.newCsrfToken) 
      } 
     ); 
    }; 
</script> 

为了进一步参考,我们已经创建了一个组件,它允许维持对被dinamically修改的客户机侧的形式启用安全性,并且消除了需要解锁字段或使Ajax时的动作调用。你可以在https://github.com/QTSdev/DynamicSecurity找到它。

+0

组件(和Github页面)已经消失。你有新链接吗? – schnauss 2015-04-06 21:05:37