본문 바로가기

Language/Spring Security

인증 이벤트 - Authentication Events

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