프로그래밍/서버 프로그래밍
스프링 시큐리티 요청 URI별 권한 처리할 때 문제상황 해결!
9/3
2019. 2. 19. 15:17
스프링 시큐리티 요청 URI별 권한 처리할 때 문제상황 해결!
스프링 시큐리티를 사용하는 프로젝트에서 /api/**
는 authenticated()
로 처리하고, /api/accounts
로 들어오는 POST
요청만 permitAll()
처리를 해줬는데 이게 실제 테스트코드에서 계속해서 실패하는 이슈가 있었다.
해당 코드는
@Override
public void configure(HttpSecurity http) throws Exception {
http.anonymous()
.and()
.authorizeRequests()
.mvcMatchers("/api/**").authenticated()
.mvcMatchers(HttpMethod.POST, "/api/accounts")
.permitAll()
.and()
.exceptionHandling()
.accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
이렇게 작성되어 있었다. 하지만 /api/accounts
로 POST
요청을 날릴때마다 권한이 없다는 에러가 발생하여서 검색결과, 스프링 공식 문서를 보면, 먼저 설정된 값이 우선순위를 가지고 있다는 것을 알게되었다.
따라서 코드의 순서를 아래와 같이 바꾸어주었다.
@Override
public void configure(HttpSecurity http) throws Exception {
http.anonymous()
.and()
.authorizeRequests()
.mvcMatchers(HttpMethod.POST, "/api/accounts")
.permitAll()
.mvcMatchers("/api/**").authenticated()
.and()
.exceptionHandling()
.accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
이렇게 바꾼뒤 테스트해 본 결과, 테스트를 통과하는 것을 확인할 수 있었다.
가끔가다 권한설정에서 이유없이 문제가 발생하여 다시 코드를 짜는 경험이 있었는데, 그것도 아마 이것과 같은 상황이었던 것 같다.
기억하자! 먼저 설정한 권한이 우선순위를 갖는다!