POST请求获得405响应,而不是由access-denied-handler

时间:2016-12-01 12:35:13

标签: java spring post spring-security http-status-code-405

这种情况发生在使用Spring Security的Spring MVC应用程序中。我已经使用映射" /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"/>

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

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"/>

但它没有帮助。

访问被拒绝处理程序在其他情况下正常工作,在请求权限不足时被点击,因此不应该成为问题的一部分。

什么可能导致这种行为?

1 个答案:

答案 0 :(得分:1)

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

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

解决了这个问题。