프로그래밍/서버 프로그래밍

스프링 시큐리티 요청 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/accountsPOST요청을 날릴때마다 권한이 없다는 에러가 발생하여서 검색결과, 스프링 공식 문서를 보면, 먼저 설정된 값이 우선순위를 가지고 있다는 것을 알게되었다.

따라서 코드의 순서를 아래와 같이 바꾸어주었다.

@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());

    }

이렇게 바꾼뒤 테스트해 본 결과, 테스트를 통과하는 것을 확인할 수 있었다.

가끔가다 권한설정에서 이유없이 문제가 발생하여 다시 코드를 짜는 경험이 있었는데, 그것도 아마 이것과 같은 상황이었던 것 같다.

기억하자! 먼저 설정한 권한이 우선순위를 갖는다!