【问题标题】:How to correctly use isAuthorized() from cakephp's AuthComponent in AJAX-calls如何在 AJAX 调用中正确使用 cakephp 的 AuthComponent 中的 isAuthorized()
【发布时间】:2013-09-11 19:53:05
【问题描述】:

我正在使用 cakephp-core 中的 AuthComponent。所以我使用 isAuthorized()-Method 来检查任何请求。 对于“正常”请求,这工作得很好——当 isAuthorized() 返回 false 时,用户被重定向到“他来自哪里”,并且使用 setFlash 我可以显示一条消息,授权问题是什么(如果我愿意的话)。

但是当涉及到 AJAX 请求时,这当然是没有意义的。然后响应是用户当前作为响应文本所在的页面...我更喜欢的是:如果在 ajax 调用上授权失败,则发送状态为 400(或其他)的响应,并且只发送消息“未授权”因为你不是管理员”(或其他)。

有没有简单的方法来实现这一点?

我想到的唯一解决方法是为所有 ajax 请求创建一个控制器。在它的 isAuthorized() 方法中,它会(如果授权失败)重定向到一个带有 1 个参数(失败消息)的操作,并且该操作只呈现此消息。但是(更不用说我根本不知道这是否会起作用,如果可能的话从 isAuthorized() 重定向,但我想它会)这对我来说似乎很……肮脏/草率。那么有人知道更简单/更清洁的方法吗?

我会很高兴有任何想法!

【问题讨论】:

    标签: php jquery ajax cakephp authorization


    【解决方案1】:

    您可以使用 HTTP 401 代码设置 json 响应并像这样终止进程:

    public function isAuthorized($user) {
        if( ... ) {
            // Auth fails
            if($this->request->is('ajax')) {
                $this->response->type('json');
                $this->response->statusCode(401);
                $this->response->body(json_encode(array('status' => 'ERROR', 'message' => 'Unauthorized')));
                $this->response->send();
                $this->_stop();
            }
        }
    }
    

    在响应正文中,您还可以设置要重定向用户的网址。使用 javascript 处理此重定向。

    【讨论】:

    • 非常感谢,效果很好!我现在正在做的是将几乎整个 isAuthorized-function 放在一个 try-block 中,如果授权失败,我不会立即返回 false 而是抛出异常;然后在 catch-block 中检查请求是否为 ajax,在第一种情况下,我使用你上面给我的代码,否则我只使用 setFlash。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多