BE전문가 프로젝트

5-4 Authorization(인가) - SecurityConfig에 인가 관련 method 추가 본문

SpringBoot Security

5-4 Authorization(인가) - SecurityConfig에 인가 관련 method 추가

원호보고서 2023. 7. 11. 23:32

SecurityConfig 수정(인가관련 method 추가)

@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final JwtService jwtService;

    private final CorsConfig corsConfig;

    private final AuthenticationEntryPointImpl authenticationEntryPointImpl;

    private final AccessDeniedHandlerImpl accessDeniedHandlerImpl;

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().mvcMatchers( "/", "/common/**");
        web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()); // 정적인 리소스들에 대해서 시큐리티 적용 무시.
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {

        http.addFilterBefore(new BeforeFilter(), BasicAuthenticationFilter.class);
        http.csrf().disable();
        http    .addFilter(corsConfig.corsFilter())                                             //인증(O), security Filter에 등록
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)     //세션 사용 x
                .and()
                .formLogin().disable()                                                          // Security에서 제공하는 form로그인 사용 X
                .httpBasic().disable()                                                          // Http basic Auth  기반으로 로그인 인증창사용 X
                .addFilter(authenticationFilter())
                .addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtService))
                .authorizeRequests()
                .antMatchers("/user/**")
                .hasAuthority("ROLE_USER")
                .antMatchers("/manager/**")
                .hasAuthority("ROLE_MANAGER")

                .and()
                .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPointImpl)
                .accessDeniedHandler(accessDeniedHandlerImpl);

    }


    public UsernamePasswordAuthenticationFilter authenticationFilter() throws Exception{

        JwtAuthenticationFilter authenticationFilter = new JwtAuthenticationFilter(jwtService, authenticationManager());
        authenticationFilter.setFilterProcessesUrl("/login");
        return authenticationFilter;
    }
}

 

추가된 코드

AccessDeniedHandlerImpl

private final AccessDeniedHandlerImpl accessDeniedHandlerImpl;

AccessDeniedHandler를 정의한 클래스로 권한 오류 시 실행되는 handle method를 정의했다

AuthorizationFilter 추가

.addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtService))

AccessDeniedHandlerImpl 추가

.accessDeniedHandler(accessDeniedHandlerImpl);

 

테스트

USER권한으로 USER 서비스 실행

"ROLE_USER" 권한을 가진 사용자의 토큰으로 "ROLE_USER"권한을 가진 사용자만이 이용할 수 있는 서비스 요청 시 정상적으로 실행이 된다.

 

USER권한으로 Manger 서비스 실행

여기서 볼 수 있듯이 권한 오류라는 문구와 함께 서비스가 제한되는 것을 볼 수 있다.

Comments