AuthenticationManager 를 Bean 등록해보자
일단 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 등록할때 사용했던 메서드이다