Spring Security에서 인증(Authentication)은 AuthenticationManager가 한다.
- 인자로 받은 Authentication이 유효한 인증인지 확인하고 Authentication객체를 리턴한다.
- 인증을 확인하는 과정에서 비활성 계정, 잘못된 비번, 잠긴 계정 등의 에러를 던질 수 있다.
AuthenticationManager의 구현체는 ProviderManager다.
[ProvideManager.class]
ProviderManager의 Authentication 객체에는 Principal의 username과 password 만이 들어온다.
해당 요청에 대한 인증을 처리할 수 있는 Provider를 찾아 이를 처리한 뒤 인증정보가 담긴 Authentication 객체를 반환한다.
ProviderManager는 인증을 직접 처리하지 않고, 여러 또 다른 AuthenticationProvider들에게 위임한다.
우리가 처리해야할 Authentication 객체는 UsernameAuthenticationToken 타입인데, 현재 AuthenticationProvider는 AnnoymousAuthenticationProvider만을 가지고 있다.
AnnoymousAuthenticationProvider는 UsernameAuthenticationToken을 처리할 수 있는 provider가 존재하지 않는다. 따라서 인증을 진행하지 못합니다.
아래 디버그 모드에서 확인할 수 있다.
따라서 Authentication 객체를 처리할 수 있는 Provider가 없다면, Provider의 parent로 가게 됩니다.
이 Authentication구현체의 아래에 보면 parent가 authentication메소드를 다시 한번 부르는 것을 확인할 수 있다.
이 메소드로 인해 다시 한번 더 ProviderManager로 들어가게 되는데, 이때 들어간 ProviderManager는 기존 ProviderManager의 부모이다.
이 때 진행하는 Provider로 DaoAuthenticationProvider가 들어온 것을 확인할 수 있습니다.
그리고 DaoAuthenticationProvider는 UsernameAuthenticationToken을 처리할 수 있습니다.
provider.supports(toTest)를 통해 supports메소드의 구현체로 들어가보면
UsernamePasswordAuthenticationToken을 처리할 수 있는 것을 알 수 있다.
마지막으로 DaoAuthenticatinProvider의 retrieveUser메소드로 들어가서 여러분들이 직접 구현할 UserDetailsService의 구현체로 들어가는 것을 확인할 수 있습니다.
참조
'Spring Security' 카테고리의 다른 글
Spring Security & CSRF & Json Web Token (0) | 2021.12.24 |
---|---|
Authentication과 SecurityContextHolder (0) | 2021.06.03 |
SecurityContextHolder와 Authentication (0) | 2021.06.02 |
댓글