HTTP 404应该在HTTP 403状态代码之前吗?

Luc*_*uke 1 java spring spring-security java-ee

我用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')")
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

我会使用404,因为资源是否存在不是非管理用户应该拥有的信息.关于代码403,甚至在HTTP规范中也包含了这个内容:

服务器理解请求,但拒绝履行请求.授权无效,请求不应重复.如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因. 如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到).

(我的重点.)

如果您使用了403,则在回复非管理员请求时,您必须使用403来查找不存在的资源,否则您的实施将泄漏信息(哪些用户存在和不存在)给非管理员用户不应该有这些信息.

有一个使用403的论据(即使用户不存在),但我认为404边缘化了.但是,无论您使用哪种方法,在回复非管理员用户对自己以外的用户页面的请求时,请始终如一地使用它,以避免信息泄露.