728x90
- 스프링 시큐리티는 인증 성공 또는 실패 여부에 따라 AuthenticationSuccessEvent 또는 AuthenticationFailureEvent를 발생
- 이벤트를 수신하려면 ApplicationEventPublisher를 사용하거나 시큐리티에서 제공하는 AuthenticationEventPublisher 를 사용해서 발행해야 함
- AuthenticationEventPublisher의 구현체로 DefaultAuthenticationEventPublisher 제공
이벤트 발행 방법
- ApplicationEventPublisher.publishEvent(ApplicationEvent)
- AuthenticationEventPublisher.publishAuthenticationSuccess(Authentication)
- AuthenticationEventPublisher.publishAuthenticationFailure(AuthenticationException, Authentication)
이벤트 수신 방법
@Component
public class AuthenticationEvents {
@EventListener
public void onSuccess(AuthenticationSuccessEvent success) {…}
@EventListener
public void onFailure(AbstractAuthenticationFailureEvent failures) {…}
}
- onSuccess나 onFailure 메서드명은 원하는대로 변경 가능
- 중요한 것은 @EventListener 어노테이션
- pubilshEvent()를 사용하여 발행하지 않으면 AuthenticationSuccessEvent나 AbstractAuthenticationFailureEvent에 이벤트 객체가 수신 되지 않음
인증 이벤트 종류
- 스프링의 이벤트 리스닝 메커니즘은 자바의 클래스 상속 구조를 따르기 때문에 특정 이벤트의 리스너는 해당 이벤트 뿐만 아니라 그 이벤트의 부모 클래스 (또는 인터페이스)들로부터 발생하는 이벤트도 처리 가능
인증 성공 이벤트 발행 & 수신
- AuthenticationSuccessEvent 객체는 ProviderManager로부터 발행
- InteractiveAuthenticationSuccessEvent 객체는 UsernamePasswordAuthenticationFilter에서 인증 성공 시에 발행
인증 실패 이벤트 발행 & 수신
- AbstractAuthenticationFailureEvent 객체는 하위 클래스 이벤트 발행 시 항상 수신
@Component
public class AuthenticationFailureEvents {
@EventListener
public void onFailure(AbstractAuthenticationFailureEvent failures) {
System.out.println("failures = " + failures.getException().getMessage());
}
@EventListener
public void onFailure(AuthenticationFailureBadCredentialsEvent failures) {
System.out.println("failures = " + failures.getException().getMessage());
}
@EventListener
public void onFailure(AuthenticationFailureDisabledEvent failures) {
System.out.println("failures = " + failures.getException().getMessage());
}
}
- ApplicationEventPublisher로 발행
applicationEventPublisher.publishEvent(new AuthenticationFailureDisabledEvent(authentication, new DisabledException("DisabledException")));
applicationEventPublisher.publishEvent(new AuthenticationFailureBadCredentialsEvent(authentication, new BadCredentialsException("BadCredentialException")));
- AuthenticationEventPublisher로 발행
authenticationEventPublisher.publishAuthenticationFailure(new BadCredentialsException("BadCredentialException"), authentication);
authenticationEventPublisher.publishAuthenticationFailure(new DisabledException("DisabledException"), authentication)
728x90
'Language > Spring Security' 카테고리의 다른 글
인가 이벤트 - Authorization Events (0) | 2024.08.03 |
---|---|
인증 이벤트 - AuthenticationEventPublisher 활용 (0) | 2024.08.02 |
AOP 메서드 보안 구현 - MethodInterceptor, Pointcut, Advisor (0) | 2024.08.02 |
포인트 컷 메서드 보안 구현 - AspectJExpressionPointcut / ComposablePointcout (0) | 2024.08.02 |
메서드 기반 Custom AuthorizationManager 구현 (0) | 2024.08.02 |