1. AccessDeninedHandler이란?

 

Spring Security에서 제공하는 인터페이스로, 사용자가 자신이 권한이 없는 리소스에 접근하려고 할 때 이를 처리하는 역할을 담당한다.

이 인터페이스를 구현하여 사용자 정의 AccessDeniedHandler를 작성하면, 권한이 없는 사용자가 리소스에 접근하려고 할 때 어떻게 처리할지를 정의한다. 예를 들어, 사용자를 특정 오류 페이지로 리디렉션하거나, HTTP 상태 코드를 반환하거나, 사용자에게 메시지를 표시하는 등의 동작을 정의할 수 있다.

 

예를 들어 내가 현재 진행중인 프로젝트에서 예를 들것이다.

 

SecurityConfig

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    //인증 설정
    http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/member/login")
            .defaultSuccessUrl("/")
            .permitAll()
            .and()
            .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/member/logout"))
            .logoutSuccessUrl("/")
            .invalidateHttpSession(true)
            .and()
            .exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler());
    return http.build();
}

에서

.antMatchers("/admin/**").hasRole("ADMIN")

코드를 통해 /admin의 하위 링크는 ADMIN이란 권한을 가지고 있는 사람만 접근을 가능하게 하였다.

이때 만약 권한이 없는 사용자가 접근하면 어떻게 되는가?

마지막의

.exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler());

코드에서 처리하게된다.

이때 .exceptionHandling()은 Spring Security 설정에서 예외 처리 설정을 제공하며 이 메서드를 이용해 인증 오류 또는 권한이 없는 접근과 같은 보안 관련 예외가 발생 하였을 때 어떤 동작을 수행하는지 정의할 수 있다.

이때 나는 accessDeniedHandler(new CustomAccessDeniedHandler());를 통해 보안 관련 예외 발생시 동작 수행을 직접 설정해 주었다.

 

 

CustomAccessDeniedHandler

public class CustomAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        response.sendRedirect("/accessBlock");
    }
}

AccessDeniedHandler의 인터페이스를 구현하며 '/accessBlock' 경로로 이동하도록 설정하였다.

이처럼 보안 관련 예외 발생 시 처리를 돕기 위한 인터페이스이다.

+ Recent posts