개발/spring-security

AuthenticationManager 를 Bean 등록해보자

나태쿤 2024. 5. 11. 04:02
728x90

 

일단 SecurityFilterChain Bean 등록하는 부분은 다음과 같다

 

[1]

 

모든 요청에 인증이 필요하고

스프링 시큐리티가 제공하는 Form 인증 방식을 사용한다

 

 

 

AuthenticationManager 를 Bean 으로 등록하기 위해서 다음 처럼 작성하면 된다

 

[2]

 

 

디버깅하면 알 수있는데 

실제 코드 동작 순서는

 

 

[2] -> [1] 흐름이다

AuthenticationManager 을 Bean 으로 등록하는 코드가 먼저 실행된다

 

getAuthenticationManager() 메서드를 좀 보자

 

111 번 라인 : 최초에는 false 이고

121 번 라인 : AuthenticationManager 을 생성하기위해 build 하고

125 번 라인 : 다음 메서드 호출시 처음에 build 한 AuthenticationManager 를 리턴한다

 

 

 

[1] 에서 http.build() 메서드를 호출하면

beforeConfigure() 메서드로 오게되고

 

AuthenticationManager 를 가져와서, share Object로 등록한다

 

3235 번 라인 if else 문으로 봐서

this.authenticationManager 가 null이 아니면

AuthenticationManager 을 공유 객체로 등록하고

 

this.authenticationManager 가 null이면

getAuthenticationRegistry().build() 메서드를 통해 생성하고 ,공유 객체로 등록한다

 

 

 

암튼 ... Bean 으로 등록된다

 

아직 이부분은 해소가 덜되었다

 

더 찾아보고 수정하겠다.

 


 

다시 한번 살펴보았는데

 

기본적으로 beforeConfigure() 에서 강제로 ProviderManager 와 내부 부모 ProviderManager가 있는

세트를 만든다

 

 

 

하지만 우리가 직접 Bean 등록한게 있기 때문에 스프링 컨테이너에는 직접 등록 Bean 이 들어가고

테스트로 컨트롤러에 DI로 의존성 주입받고 확인 해보면 다른걸 볼 수 있다

 

 

 

여기서 @7780 을 보면 직접 Bean 으로 등록한게 부모의 Provider 인건데

 

여기서 먼저 인증관리자빌더에 부모먼저 셋팅해서 그런것으로 유추된다

 

 

 

그리고 안쪽메서드에 authenticationManager() 를 보면

 

 

[2] 에서 직접 Bean 등록할때 사용했던 메서드이다

 

728x90