对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
这个问题是前一段时间提出来的,但人们的想法还在继续。
本草案的第6.5.3节(由Fielding和Reschke编写)赋予状态代码403与RFC 2616中所记录的状态代码略有不同的含义。
它反映了许多流行的web服务器和框架使用的身份验证和授权方案中发生的情况。
我强调了我认为最突出的一点。
6.5.3.403禁止403(禁止)状态代码表示服务器理解请求但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应有效负载(如果有的话)中描述该原因。如果请求中提供了身份验证凭据,则服务器认为这些凭据不足以授予访问权限。客户端不应使用相同的凭据重复请求。客户端可以使用新的或不同的凭据重复请求。但是,由于与凭据无关的原因,请求可能被禁止。希望“隐藏”当前存在的禁用目标资源的源服务器可能会以状态代码404(未找到)进行响应。
无论您使用什么约定,重要的是在站点/API中提供一致性。
其他回答
401未经授权:我不知道你是谁。这是一个身份验证错误。403禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。
编辑:RFC2616已过时,请参阅RFC9110。
401未授权:
如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。
403禁止:
服务器理解该请求,但拒绝履行该请求。
从您的用例来看,用户似乎没有经过身份验证。我会返回401。
根据RFC 2616(HTTP/1.1)403在以下情况下发送:
服务器理解该请求,但拒绝履行该请求。授权没有帮助,不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开请求未完成的原因,则应在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码404(未找到)
换句话说,如果客户端可以通过认证访问资源,则应发送401。
我对它的看法与公认的答案略有不同。
当认证失败时返回403,当授权失败时返回401,这似乎更符合语义和逻辑。
我的理由如下:
当您请求认证时,您有权提出该请求。你需要这样做,否则一开始就没有人能够通过认证。
如果您的身份验证失败,您将被禁止,这是有意义的。
另一方面,被禁止者也可以申请授权,但假设您已通过身份验证,但无权访问特定端点。返回401 Unauthorized似乎更有意义。
对于失败的身份验证尝试,Spring Boot的安全性返回403
英语:
401
您可能被允许访问,但出于某种原因否认。例如密码错误?请使用正确的请求重试你会得到成功的回应。
403
你永远不被允许。你的名字不在名单上,你不会一旦进入,离开,不要发送重试请求,它将被拒绝,总是走开。