这种情况发生在使用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"/>
但它没有帮助。
访问被拒绝处理程序在其他情况下正常工作,在请求权限不足时被点击,因此不应该成为问题的一部分。
什么可能导致这种行为?
答案 0 :(得分:1)
就我而言,问题出在/denied
请求的控制器方法中。它有一个GET版本,但不是POST版本。添加这样的POST版本:
@RequestMapping(value = "/denied", method = RequestMethod.POST)
public @ResponseBody Response userAccessDeniedForPost() {
...
}
解决了这个问题。