2016-12-01 1 views
0

이는 스프링 보안이 사용되는 스프링 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"/> 

에 의해 처리됩니다 내가 /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

내 경우에는 컨트롤러 메서드에서 /denied 요청에 문제가있었습니다. 그것은 GET 버전 이었지만 POST 버전은 아니 었습니다. 다음과 같은 POST 버전을 추가하십시오 :

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

이 문제를 해결했습니다.