Authentication Events

김상욱·2024년 12월 8일

각 인증이 성공하거나 실패할 때마다, 각각 AuthenticationSuccessEvent 또는 AuthenticationFailureEvent가 발생합니다.

이 이벤트를 수신하려면 먼저 AuthenticationEventPublisher를 등록해야 합니다. Spring Security의 DefaultAuthenticationEventPublisher는 이 용도로 적합하게 작동합니다.

Java 예제

@Bean
public AuthenticationEventPublisher authenticationEventPublisher
        (ApplicationEventPublisher applicationEventPublisher) {
    return new DefaultAuthenticationEventPublisher(applicationEventPublisher);
}

그런 다음 Spring의 @EventListener 기능을 사용하여 이벤트를 처리할 수 있습니다.

Java 예제

@Component
public class AuthenticationEvents {
    @EventListener
    public void onSuccess(AuthenticationSuccessEvent success) {
        // 성공 시 처리 로직
    }

    @EventListener
    public void onFailure(AbstractAuthenticationFailureEvent failures) {
        // 실패 시 처리 로직
    }
}

AuthenticationSuccessHandlerAuthenticationFailureHandler와 비슷하지만, 이러한 방식은 서블릿 API와 독립적으로 사용할 수 있다는 점에서 유용합니다.


예외 매핑 추가하기

기본적으로 DefaultAuthenticationEventPublisher는 아래와 같은 예외에 대해 AuthenticationFailureEvent를 발행합니다:

예외(Exception)이벤트(Event)
BadCredentialsExceptionAuthenticationFailureBadCredentialsEvent
UsernameNotFoundExceptionAuthenticationFailureBadCredentialsEvent
AccountExpiredExceptionAuthenticationFailureExpiredEvent
ProviderNotFoundExceptionAuthenticationFailureProviderNotFoundEvent
DisabledExceptionAuthenticationFailureDisabledEvent
LockedExceptionAuthenticationFailureLockedEvent
AuthenticationServiceExceptionAuthenticationFailureServiceExceptionEvent
CredentialsExpiredExceptionAuthenticationFailureCredentialsExpiredEvent
InvalidBearerTokenExceptionAuthenticationFailureBadCredentialsEvent

DefaultAuthenticationEventPublisher는 예외에 대해 정확한 매칭을 수행합니다. 이는 이러한 예외의 하위 클래스는 이벤트를 생성하지 않는다는 것을 의미합니다.

따라서, 추가 매핑이 필요할 경우 setAdditionalExceptionMappings 메서드를 통해 제공할 수 있습니다:

Java 예제

@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에 대해 발생할 기본 이벤트를 설정할 수도 있습니다.

Java 예제

@Bean
public AuthenticationEventPublisher authenticationEventPublisher
        (ApplicationEventPublisher applicationEventPublisher) {
    DefaultAuthenticationEventPublisher authenticationEventPublisher =
        new DefaultAuthenticationEventPublisher(applicationEventPublisher);
    authenticationEventPublisher.setDefaultAuthenticationFailureEvent
        (AbstractAuthenticationFailureEvent.class);
    return authenticationEventPublisher;
}

이 설정은 특정 예외가 매핑되지 않은 경우에도, 기본 이벤트를 발행하도록 보장합니다.

0개의 댓글