【发布时间】:2014-07-30 01:09:29
【问题描述】:
我们最近开始将 @PreAuthorize 注释与我们的 REST 端点一起使用。它工作得很好,但是,我确实对发出 GET 与 POST 或 PUT 时返回的 HTTP 代码有疑问。
当用户无权访问控制器的 REST 端点时,GET 和 PUT/POST 返回的 HTTP 状态似乎不同。
例如,如果我有一个 GET 端点并且有一个 @PreAuthorize 注释并且用户没有访问权限,则返回 403 Forbidden。这是我所期望的。
如果随后将相同的注释放置在 POST 或 PUT 的控制器方法上,则 HTTP 响应为 405 Method Not Allowed(请注意,正确授权后,POST/PUT 方法按预期返回 200)。
单步执行代码时,您可以看到底层安全过滤器返回 403,但在 POST/PUT 场景中,状态代码被丢弃/忽略并替换为 405,就像发生 NullPointerExcpetion 时一样在您的控制器代码中。
这是预期的行为还是应该始终为无权访问端点的用户返回 403 Forbidden?
【问题讨论】:
-
在我看来,web security layer 抛出了 405,而不是 @PreAuthorize 注释的访问控制层。尝试为包 org.springframework.security 启用调试级别,看看那里到底发生了什么
-
我认为您的请求方法类型不正确
标签: rest spring-security annotations