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() {
...
}
解决了问题。
这发生在 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() {
...
}
解决了问题。