对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?

401未授权?403禁止?还有别的吗?

到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?


当前回答

401未经授权:我不知道你是谁。这是一个身份验证错误。403禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。

其他回答

他们未登录或不属于正确的用户组

你陈述了两种不同的情况;每种情况都应有不同的反应:

如果他们根本没有登录,您应该返回401未授权如果他们已登录但不属于正确的用户组,则应返回403禁止

根据收到的对此答案的评论,请注意RFC:

如果用户未登录,他们将被取消身份验证,其HTTP等效值为401,在RFC中被错误地称为“未授权”。如第10.4.2节所述,401未经授权:

“请求需要用户身份验证。”

如果您未经认证,401是正确的响应。然而,如果您未经授权,在语义正确的意义上,403是正确的响应。

这个问题是前一段时间提出来的,但人们的想法还在继续。

本草案的第6.5.3节(由Fielding和Reschke编写)赋予状态代码403与RFC 2616中所记录的状态代码略有不同的含义。

它反映了许多流行的web服务器和框架使用的身份验证和授权方案中发生的情况。

我强调了我认为最突出的一点。

6.5.3.403禁止403(禁止)状态代码表示服务器理解请求但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应有效负载(如果有的话)中描述该原因。如果请求中提供了身份验证凭据,则服务器认为这些凭据不足以授予访问权限。客户端不应使用相同的凭据重复请求。客户端可以使用新的或不同的凭据重复请求。但是,由于与凭据无关的原因,请求可能被禁止。希望“隐藏”当前存在的禁用目标资源的源服务器可能会以状态代码404(未找到)进行响应。

无论您使用什么约定,重要的是在站点/API中提供一致性。

我对它的看法与公认的答案略有不同。

当认证失败时返回403,当授权失败时返回401,这似乎更符合语义和逻辑。

我的理由如下:

当您请求认证时,您有权提出该请求。你需要这样做,否则一开始就没有人能够通过认证。

如果您的身份验证失败,您将被禁止,这是有意义的。

另一方面,被禁止者也可以申请授权,但假设您已通过身份验证,但无权访问特定端点。返回401 Unauthorized似乎更有意义。

对于失败的身份验证尝试,Spring Boot的安全性返回403

丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:

401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。

另一种很好的图片格式,说明如何使用http状态代码。

我已经为您创建了一个简单的注释,它将使您明白。