使用@PreAuthorize时,从Spring Controllers返回405 vs 403

bor*_*orq 10 rest annotations spring-security

我们最近开始在@PreAuthorize我们的REST端点上使用注释.它工作得很好,但是,我确实对发出GET与POST或PUT时返回的HTTP代码有疑问.似乎当用户未被授权访问控制器的REST端点时,返回的HTTP状态对于GET和PUT/POST是不同的.

因此,例如,如果我的端点是GET并且具有@PreAuthorize注释并且用户没有访问权限,则返回403 Forbidden.这就是我的期望.

如果然后将相同的注释放在POST或PUT的控制器方法上,则HTTP响应为405 Method Not Allowed(请注意,如果正确授权,POST/PUT方法将按预期返回200).

单步执行代码时,您可以看到底层安全过滤器返回403,但在POST/PUT场景中,状态代码被删除/忽略并替换为405,就像NullPointerExcpetion在控制器代码中出现时一样.

这是预期的行为还是应该为无法访问终点的用户返回403 Forbidden?

小智 0

请求之间的某个位置可能会被内部重定向,并最终到达期望不同 HTTP 请求类型的端点,因此您会收到 HTTP 405。我发现这在身份验证情况下是最常见的原因