2016-12-01 41 views
0

这发生在也使用Spring Security的Spring MVC应用程序中。我已经配置了映射“/user/save”的要求,以便只有管理员可以访问它:POST请求获取405响应,而不是由访问拒绝处理程序处理

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

,但它并没有帮助。

访问被拒绝的处理程序在其他情况下工作正常,当请求使用不足的特权进行访问时被访问,所以不应该成为问题的一部分。

什么可能导致此行为?

回答

1

在我的情况下,问题是在/denied请求的控制器方法。它有一个GET版本,但不是POST版本。添加如下的POST版本:

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

解决了这个问题。