在XHR和标准执行之间进行Auth区分

时间:2016-04-12 08:31:23

标签: javascript php xmlhttprequest

我有以下方法

private function adminRequired($accessControl)
{
    $user = new \CloseCall\ValueObject\User(2);
    if(!$accessControl->isAdmin($user)) {
        header("location: /auth");
        http_response_code(401);
    }
}

在我的控制器中,此方法始终在构建控制器时运行,以检查用户是否具有管理员权限。

我遇到的问题是XHR请求也可以发送到此控制器而header重定向不适合这种情况,在这种情况下我想发回401 http响应javascript并在那里处理这个响应。

如果我发送标题重定向然后是http响应代码,那么在正常执行控制器时会跳过标题重定向。

如果我发送响应代码然后重定向标题,那么javascript会尝试XHR到我的/ auth控制器。

我的问题是如何区分XHR请求和标准执行还是更好,然后优雅地处理它?

1 个答案:

答案 0 :(得分:1)

默认情况下,没有办法区分。

通常,您会在请求中添加额外的标头。最RESTful的方法是使用Accept标题。

e.g。

xhr.setRequestHeader("Accept", "application/json");

...说你更喜欢JSON作为响应格式。

然后,服务器可以测试JSON是否优先于HTML,然后假设它需要API样式响应(而不是HTML响应)。

使用完全自定义标头的一种不那么RESTful和更多hacky方法:

xhr.setRequestHeader("x-requested-with", "xmlhttprequest");