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

时间:2013-05-12 13:54:22

标签: java spring java-ee spring-security

我使用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')")

2 个答案:

答案 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状态代码作为响应   来自客户端的请求,以指示该网页或资源   服务器拒绝允许请求的操作。换句话说,   服务器可以到达,但服务器拒绝允许请求   访问。