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");
我有以下方法
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");