我使用Spring MVC 3.1创建了一个Web服务(RESTful),并添加了Spring安全性。其中一个端点是/users/{id}
,只有管理员才能使用。但是,当且仅当检索到的资源的用户名与登录用户的用户名匹配时,/users/{id}
也可供用户使用。这可以通过使用@PostAuthorize注释来解决。
现在,如果用户访问/users/999
(不是登录用户),我应该返回HTTP状态404还是HTTP状态403?目前我正在做一个404(未找到),但它应该是403,因为用户不应该访问它吗?
如果是这样,当你依赖@PostAutorize注释时,你会怎么做?
@PostAuthorize("returnObject.username == principal.username and hasRole('ROLE_USER')")
答案 0 :(得分:8)
我会使用404,因为资源是否存在不是非管理用户应该拥有的信息。这甚至包含在the HTTP specification with regard to code 403中:
服务器理解请求,但拒绝履行请求。 授权无效,请求不应重复。 如果请求方法不是HEAD并且服务器希望进行 公开为什么请求没有得到满足,它应该描述 实体拒绝的原因。 如果服务器不希望 将此信息提供给客户端,状态代码404 (未找到)可以改为使用。
(我的重点。)
如果您使用403,则在回复非管理员请求时,您必须使用403来查找不存在的资源,否则您的实施将泄漏信息(用户存在与否)不应该拥有该信息的管理员用户。
有一个使用403的论据(即使用户不存在),但我认为404将其边缘化了。但是,无论您使用哪种方式,在回复非管理员用户对自己以外的用户页面的请求时,请始终使用 ,以避免信息泄露。
答案 1 :(得分:0)
您应该使用403作为资源可用但不允许用户。 HTTP 403规范明确提到:
服务器理解请求,但拒绝履行请求。 授权无效,请求不应重复。如果 请求方法不是HEAD,服务器希望公开 为什么请求没有得到满足,它应该描述原因 因为该实体的拒绝。如果服务器不想做 此信息可供客户使用,状态代码404(不是 找到了)可以代替使用。
Web服务器可能会返回403 Forbidden HTTP状态代码作为响应 来自客户端的请求,以指示该网页或资源 服务器拒绝允许请求的操作。换句话说, 服务器可以到达,但服务器拒绝允许请求 访问。