在CakePHP中实现授权后,JSON视图无法正常工作

时间:2013-02-26 20:40:50

标签: cakephp cakephp-2.3

由于我在cakephp项目中实现了授权,因此我无法再使用JSON访问我的视图了。我是否必须在任何地方设置特定设置才能重新开始工作? 我希望将autoComplete添加到allowedActions并且isAuthorized会执行这个技巧

app \ Controller \ BrandsController.php(从不必要的代码中删除)

<?php
    App::uses('Sanitize', 'Utility');

    class BrandsController extends AppController {
        public $helpers = array('Html', 'Form', 'Session');
        public $components = array('Session', 'RequestHandler');

        public function beforeFilter() {
            parent::beforeFilter();
            $this->Auth->allowedActions = array('autoComplete');
        }

        public function isAuthorized($user) {
            if ($this->action === 'view' || $this->action === 'index' || $this->action === 'autoComplete') {
                return true;
            }
            return parent::isAuthorized($user);
        }

        public function autoComplete($name = null)
        {
            if(!$name)
            {
                $name = @$this->params->query['name'];
            }

            $name = Sanitize::paranoid($name, array(' '));

            if (!$name || empty($name))
            {
                new NotFoundException(__('Invalid searchquery'));
            }
            else
            {

                $objects = $this->Brand->find('list', 
                    array(
                        'conditions' => array("Brand.name LIKE" => "%" . $name . "%")
                    )
                );
                $this->layout = 'ajax';
                $this->RequestHandler->setContent('json', 'application/json' ); 
                $this->set(compact('objects'));
                $this->render('json/output_json');
            }
        }
    }
?>

应用\视图\品牌\ JSON \ output_json.ctp

<?php
    Configure::write('debug', 0);
    echo json_encode($objects);
?>

致电

<?php 
    $brandsAutoCompleteUrl = Router::url(array('controller' => 'brands', 'action' => 'autoComplete')); 
?>
<script type="text/javascript">
    $(document).ready(function(){
        $.getJSON('<?php echo $brandsAutoCompleteUrl; ?>', { name: 'test' }, function(data) {
            // never called
        });
    });
</script>

在我的Chrome调试窗口中,它是sais

GET http://localhost/cakephp/brands/autoComplete?name=tes 500 (Internal Server Error)

当我直接从浏览器中调用此URL时,我得到了预期的结果

2 个答案:

答案 0 :(得分:2)

我通过替换

解决了这个问题
$this->RequestHandler->setContent('json', 'application/json' ); 

通过

$this->response->type(array('json' => 'application/json'));

答案 1 :(得分:1)

正确允许

$this->Auth->allow('view', 'index');

这只能在允许操作所有者的控制器中完成 - Link to documentation

此外 - 在firefox firebug或chrome中,您可以查看500 HTTP错误的响应,该错误通常是具有精确CakePHP错误的HTML代码 - 首先进行调查。

为什么要在此控制器中添加组件和帮助程序而不是AppController?这些组件对于任何控制器都是通用的 - 将它们放到AppController中是合理的 如果您没有注意到 - AppController的所有帮助程序和组件都与子控制器的帮助程序和组件合并。您无法通过替换子控制器中的组件来关闭Auth组件。

建议:
避免使用&#39; @&#39;像@$this->params->query['name'];这样的代码。如果&#39;使用!empty($this->params->query['name'])。条件

如果你不知道:empty($name) == !$name!$name也可以触发变量$ name中的错误 - http://www.php.net/manual/ru/types.comparisons.php(第1张表)