각 인증이 성공하거나 실패할 때마다, 각각 AuthenticationSuccessEvent 또는 AuthenticationFailureEvent가 발생합니다.
이 이벤트를 수신하려면 먼저 AuthenticationEventPublisher를 등록해야 합니다. Spring Security의 DefaultAuthenticationEventPublisher는 이 용도로 적합하게 작동합니다.
@Bean
public AuthenticationEventPublisher authenticationEventPublisher
(ApplicationEventPublisher applicationEventPublisher) {
return new DefaultAuthenticationEventPublisher(applicationEventPublisher);
}
그런 다음 Spring의 @EventListener 기능을 사용하여 이벤트를 처리할 수 있습니다.
@Component
public class AuthenticationEvents {
@EventListener
public void onSuccess(AuthenticationSuccessEvent success) {
// 성공 시 처리 로직
}
@EventListener
public void onFailure(AbstractAuthenticationFailureEvent failures) {
// 실패 시 처리 로직
}
}
AuthenticationSuccessHandler 및 AuthenticationFailureHandler와 비슷하지만, 이러한 방식은 서블릿 API와 독립적으로 사용할 수 있다는 점에서 유용합니다.
기본적으로 DefaultAuthenticationEventPublisher는 아래와 같은 예외에 대해 AuthenticationFailureEvent를 발행합니다:
| 예외(Exception) | 이벤트(Event) |
|---|---|
BadCredentialsException | AuthenticationFailureBadCredentialsEvent |
UsernameNotFoundException | AuthenticationFailureBadCredentialsEvent |
AccountExpiredException | AuthenticationFailureExpiredEvent |
ProviderNotFoundException | AuthenticationFailureProviderNotFoundEvent |
DisabledException | AuthenticationFailureDisabledEvent |
LockedException | AuthenticationFailureLockedEvent |
AuthenticationServiceException | AuthenticationFailureServiceExceptionEvent |
CredentialsExpiredException | AuthenticationFailureCredentialsExpiredEvent |
InvalidBearerTokenException | AuthenticationFailureBadCredentialsEvent |
DefaultAuthenticationEventPublisher는 예외에 대해 정확한 매칭을 수행합니다. 이는 이러한 예외의 하위 클래스는 이벤트를 생성하지 않는다는 것을 의미합니다.
따라서, 추가 매핑이 필요할 경우 setAdditionalExceptionMappings 메서드를 통해 제공할 수 있습니다:
@Bean
public AuthenticationEventPublisher authenticationEventPublisher
(ApplicationEventPublisher applicationEventPublisher) {
Map<Class<? extends AuthenticationException>,
Class<? extends AbstractAuthenticationFailureEvent>> mapping =
Collections.singletonMap(FooException.class, FooEvent.class);
DefaultAuthenticationEventPublisher authenticationEventPublisher =
new DefaultAuthenticationEventPublisher(applicationEventPublisher);
authenticationEventPublisher.setAdditionalExceptionMappings(mapping);
return authenticationEventPublisher;
}
모든 AuthenticationException에 대해 발생할 기본 이벤트를 설정할 수도 있습니다.
@Bean
public AuthenticationEventPublisher authenticationEventPublisher
(ApplicationEventPublisher applicationEventPublisher) {
DefaultAuthenticationEventPublisher authenticationEventPublisher =
new DefaultAuthenticationEventPublisher(applicationEventPublisher);
authenticationEventPublisher.setDefaultAuthenticationFailureEvent
(AbstractAuthenticationFailureEvent.class);
return authenticationEventPublisher;
}
이 설정은 특정 예외가 매핑되지 않은 경우에도, 기본 이벤트를 발행하도록 보장합니다.