对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
!!! DEPR:答案反映了直到2014年以前的普遍做法!!!
TL;博士
401:与身份验证有关的拒绝403:拒绝与身份验证无关
实际示例
如果apache需要身份验证(通过.htaccess),并且您单击“取消”,则它将响应401“所需授权”
如果nginx找到了一个文件,但没有读取/访问该文件的访问权限(用户/组),那么它将响应403 Forbidden
RFC(2616第10节)
401未授权(10.4.2)
含义1:需要认证
请求需要用户身份验证。。。
含义2:身份验证不足
…如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。。。
403禁止(10.4.4)
含义:与身份验证无关
…授权没有帮助。。。
更多详情:
服务器理解该请求,但拒绝履行该请求。
应说明实体拒绝的原因
可以改用状态代码404(未找到)
(如果服务器希望将此信息保留给客户端)
其他回答
他们未登录或不属于正确的用户组
你陈述了两种不同的情况;每种情况都应有不同的反应:
如果他们根本没有登录,您应该返回401未授权如果他们已登录但不属于正确的用户组,则应返回403禁止
根据收到的对此答案的评论,请注意RFC:
如果用户未登录,他们将被取消身份验证,其HTTP等效值为401,在RFC中被错误地称为“未授权”。如第10.4.2节所述,401未经授权:
“请求需要用户身份验证。”
如果您未经认证,401是正确的响应。然而,如果您未经授权,在语义正确的意义上,403是正确的响应。
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的情况下,这已经得到了多次回答。这本质上是一场“HTTP请求环境”辩论,而不是“应用程序”辩论。
您自己的登录问题(应用程序)似乎有问题。
在这种情况下,仅仅不登录不足以发送401或403,除非您使用HTTP Auth与登录页面(与设置HTTP Auth无关)。听起来您可能正在寻找一个“201已创建”,其中有一个滚动您自己的登录屏幕(而不是请求的资源),用于应用程序级访问文件。上面写着:
“我听到了,它在这里,但试试这个(不允许你看到)”
401未经授权:我不知道你是谁。这是一个身份验证错误。403禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。
我已经为您创建了一个简单的注释,它将使您明白。