1

由于我在我的 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 调试窗口中,它是

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

当我直接从浏览器调用这个 url 时,我得到了预期的结果

4

2 回答 2

2

我通过更换解决了这个问题

$this->RequestHandler->setContent('json', 'application/json' ); 

经过

$this->response->type(array('json' => 'application/json'));
于 2013-02-27T18:29:23.353 回答
1

正确的允许是

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

这只能在允许操作的所有者的控制器中完成 - 链接到文档

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

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

建议:
避免在@$this->params->query['name'];. !empty($this->params->query['name'])在“如果”条件下使用

如果您不知道:empty($name) == !$name,也!$name可以在变量 $name 未启动时触发错误 - http://www.php.net/manual/ru/types.comparisons.php(第一个表)

于 2013-02-26T23:16:38.527 回答