정수원님의 강의 스프링 시큐리티 완전 정복 [6.x 개정판] 보면서 공부한 내용입니다.
@Component
public class AuthenticationEvents {
@EventListener // 이벤트를 수신하는 클래스가 된다는 의미의 어노테이션
public void onSuccess(AuthenticationSuccessEvent success) {
// 발행된 이벤트를 적용해야지 수신이 가능함
}
@EventListener
public void onFailure(AbstractAuthenticationFailureEvent failures) {…}
}
@Bean // ApplicationEventPublisher 객체 타입의 빈을 정의
public AuthenticationEventPublisher customAuthenticationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
Map<Class<? extends AuthenticationException>, Class<? extends AbstractAuthenticationFailureEvent>> mapping =
Collections.singletonMap(CustomException.class, CustomAuthenticationFailureEvent.class);
// CustomException.class 예외가 발생하면 CustomAuthenticationFailureEvent.class 이벤트가 발행된다
// DefaultAuthenticationEventPublisher는 예외와 이벤트를 mapping하고 있음
// 만약 A예외가 발생하면 A이벤트(실패 이벤트)가 발행하라
// 즉, 모든 예외마다 각각의 이벤트를 맵핑하고 있음
DefaultAuthenticationEventPublisher authenticationEventPublisher = new DefaultAuthenticationEventPublisher(applicationEventPublisher);
authenticationEventPublisher.setAdditionalExceptionMappings(mapping); // 이벤트 매핑 추가
return authenticationEventPublisher;
}
@Bean
public AuthenticationEventPublisher defaulAuthenticationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
DefaultAuthenticationEventPublisher authenticationEventPublisher
= new DefaultAuthenticationEventPublisher(applicationEventPublisher);
authenticationEventPublisher
.setDefaultAuthenticationFailureEvent(CustomDefaultAuthenticationFailureEvent.class); // 기본 이벤트 설정
@Component
public class AuthorizationEvents {
@EventListener
public void onAuthorization(AuthorizationDeniedEvent failure){
// AuthorizationDeniedEvent : 접근이 거부됐을 때 발생하는 이벤트
}
@EventListener
public void onAuthorization(AuthorizationGrantedEvent success){
// AuthorizationGrantedEvent : 접근이 허용됐을 때 발생하는 이벤트
}
}
// 기본 AuthorizationEventPublisher 구현
@Bean
public AuthorizationEventPublisher authorizationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
return new SpringAuthorizationEventPublisher(applicationEventPublisher);
}