POST 请求得到 405 响应而不是被 access-denied-handler 处理

POST request gets 405 response instead of being handled by access-denied-handler

这发生在 Spring MVC 应用程序中,其中还使用了 Spring 安全性。我已使用映射“/user/save”配置请求,以便只有管理员可以访问它:

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')"/>
<intercept-url pattern="/user/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR'"/>

未经授权的请求由

处理
<access-denied-handler error-page="/denied"/>

当我发出只有 ROLE_OPERATOR/user/save 请求时,我收到以下警告:

WARN http-nio-8080-exec-20 servlet.PageNotFound:208 - Request method 'POST' not supported

/denied 不会被击中。为什么?

类似问题的答案建议为 POST 查询配置 csrf,但是 POST 查询适用于 ROLE_ADMIN,所以这不应该是这里的问题。

我试过像这样在安全配置中指定方法类型:

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="GET"/>
<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="POST"/>

但没有用。

拒绝访问处理程序在其他情况下可以正常工作,当请求的权限不足时会受到攻击,因此这也不应该成为问题的一部分。

什么会导致这种行为?

在我的例子中,问题出在 /denied 请求的控制器方法中。它有一个 GET 版本,但没有 POST 版本。添加这样的 POST 版本:

@RequestMapping(value = "/denied", method = RequestMethod.POST)
public @ResponseBody Response userAccessDeniedForPost() {
    ...
}

解决了问题。