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

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

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


当前回答

你又是谁??(程序员走进一个没有ID或ID无效的酒吧)

403:太好了,又是你。我盯着你了。走吧,离开这里。(程序员走进一家86岁的酒吧)

其他回答

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

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

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

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

401:您需要HTTP基本身份验证才能看到这一点。

如果用户只需要使用您站点的标准HTML登录表单登录,401将不合适,因为它特定于HTTP基本身份验证。

403:此资源存在,但您无权查看它,HTTP基本身份验证也无济于事。

我不建议使用403来拒绝访问/包含之类的内容,因为就web而言,这些资源根本不存在,因此应该使用404。

换句话说,403表示“此资源需要HTTP基本身份验证以外的某种身份验证(例如使用网站的标准HTML登录表单)”。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2

其含义如下:

401:用户未(正确)验证,资源/页面需要验证

403:用户的角色或权限不允许访问请求的资源,例如,用户不是管理员,请求的页面是管理员的。

注意:从技术上讲,403是401的超集,因为给未经认证的用户403也是合法的。无论如何,区分更有意义。

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

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

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

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

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

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