본문 바로가기

SpringSecurity

SpringSecurity(AuthenticationManager)

반응형

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

 

  • AuthenticationProvider 목록중에서 인증 처리 요건에 맞는 AuthenticationProvider 를 찾아 인증처리를 위임한다
  • 부모ProviderManager 를 설정하여 AuthenticationProvider를 계속 탐색 할 수 있다

AutheticationManager는 인증처리를 하는 첫번째 클래스이다. 사용자의 아이디와 패스워드를  Authentication(인증객체)에 담아서

AutheticationManager 에게 전달함으로써 AutheticationManager는 전반적으로 인증에 관해 모든 처리를 관리한다

AutheticationManager 인터페이스고 구현체가  ProviderManager이다  ProviderManager가 초기화 되면서 Provider타입의 객체들을

전달받는다 객체들중에 하나를 전달받아서 인증처리를 하게된다

 

사용자가 폼인증 방법으로 인증을 시도한다면  ProviderManager는 요청에 맞는 Provider타입의 객체을 호출(DaoAuthentication)

을 호출하고 인증에 성공한 결과를 다시 ProviderManager에게 전달한다 전달받은 ProviderManager는 자신을 호출한 필터에게 인증결과를담은 객체를 전달한다 

 

사용자가 RememberMe 인증을 요청하면 ProviderManager는 요청에 맞는 Provider타입객체를 호출(RemeberMeAuthetication)을 호출하고 인증에 성공한 결과를 다시 ProviderManager에게 전달한다 전달받은 ProviderManager는 자신을 호출한 필터에게 인증결과를담은 객체를 전달한다 

 

Oauth 인증을 요청한게되면 ProviderManager는 parent 속성이 있는데 초기화 되면서 부모타입의 ProviderManager타입의 객체를 저장한다 ProviderManage안에는 OauthAuthenticationProvider가 있기 때문에 부모타입의 ProviderManager에서 인증처리를 하고 인증에 성공한 결과를 다시 ProviderManager에게 전달한다 전달받은 ProviderManager는 자신을 호출한 필터에게 인증결과를담은 객체를 전달한다 .

 

 

 

AuthenticationManagerBuilder.java

AuthenticationManager 클래스의 객체를 생성하는 역활을 한다 SpringSecurity가 초기화 되면서 AuthticationProvider 추가할수 있도록 제공한다 현재 필자는 폼인증으로 로그인을 시도하기 때문에  DaoAuthenticationProvider가 호출되었다. 그리고 ProviderManager를 생성하면서 두개의 파라미터 값을 생성하여 ProviderManager에게 전달하고 있다.

 

 

 

 

ProviderManager.java
ProviderManager.java

ProviderManager는 provider를 담을수 있는 list타입의 변수가 존재하고 AuthenticationManager타입의 parent가 존재한다

현재 Provider는 DaoAuthenticationProvider를 담고 있고 parent속성은 널로 확인할수 있다. 이과정은 초기화 되면서 이루어지는 과정이다. 

 

 

 

 

다시 AuthticationProvider 생성되는 필터로 돌아가면 AnonymousAuthenticationProvider가 생성되고 다시 ProviderManager 생성한다즉! 방금생성된 AnonymousAuthenticationProvider를 담은 리스트 변수를 가지고 있는 ProviderManager 와 스프링이 초기화 되면서 생성된 DaoAuthenticationProvider를 가지고 있는 ProviderManager 즉 ProviderManager가 2개가 생성된걸 알수가 있다.

 

처음에 생성된 ProviderManager가 부모용으로 사용되고 현재 생성된 ProviderManager는 부모를 가지고 있는 기본값인 ProviderManager라고 보면된다.즉 하나는 AnonymousAuthenticationProvider가진 Provider하는 폼인증을 처리 하기위한DaoAuthenticationProvider가진 Provider라고 보면된다.

 

 

UsernamePasswordAythentication.java  , ProviderManager.java

 

이클래스에서 유저네임과 패스워드를 추출하고 Authentication(인증객체) 담아서 AuthenticationManager 에게 전달한다

AuthenticationManager 는 초기화 과정에서 두개의 Provider를 생성했는데 디버깅을 통해 확인할수 있다. 현재 필자는 폼인증 요청했기 때문에 요청에 맞는 Provider를 찾는과정이다. 

 

AnonymousAuthenticationProvider.java

 찾는 조건을 확인해보면 현재 필터로 부터 Authentication(인증객체) 를 전달받고 AnonymousAuthenticationToken타입의 객체와 비교해서 일치하는지 확인을 하는과정이다 일치한다면 True 아니면 false다 현재는 false다 그래서 continue에 걸려서 지나가질 못하고 있다.

 

 

 

ProviderManger.java

현재는 인증을 받지 않았기 때문에 result값이 널이다. 여기서 result는 Provider가 인증 처리를 해서 인증결과를 ProviderManager에게 전달하게 된다. 그리고 디버깅을 통해서 parent속성을 보면 ProviderManager가 있기 때문에 널값이 아니다.  그러면 부모용 ProviderManager를 탐색하게된다.  부모는 현재 DaoAuthenticationProvider를 가지고 있는걸 위에서 확인한적이 있다.! 자 한번 들어가보자

 

 

 

AbstractUserDetailAuthenticationProvider.java

이클래스는 DaoAuthenticationProvider 부모 클래스이다. 여기에서 전달받은 authentication(인증객체와) 토큰값이 일치하다는것을 확인할수 있다. 그러면 DaoAuthenticationProvider가 폼인증으로 인증을 시도하게 되고 최종결과를 ProviderManager에게 반환을 하고 자신을 호출한 필터에게 전달한다

 

여기까지가 AutheticationManager가 하는역활이다.

반응형