XHR 和标准执行之间的授权区别

Auth differentiation between XHR and standard execute

我有以下方法

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 并在那里处理此响应。

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

如果我发送响应代码然后 header 重定向然后 javascript 尝试 XHR 到我的 /auth 控制器。

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

默认情况下,无法区分。

通常,您会向请求添加额外的 header。最 RESTful 的方法是使用 Accept header.

例如

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

…表示您更喜欢 JSON 作为响应格式。

服务器然后可以测试 JSON 是否比 HTML 更受欢迎,然后假定它需要 API 样式的响应(而不是 HTML 响应)。

一种更少 RESTful 而更 hacky 的方法是使用完全自定义的 header:

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