작성
·
267
0
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
return configuration.getAuthenticationManager();
}
위 처럼 Bean 으로 등록하게되면
내부 메서드에서 Bean으로 등록된
Builder를 통해 등록하는거 까지는 이해했는데요.
근데 여기서 setShareObject와 같은게 없는데
return http.build();
빌드하게되면
HttpSecurity 메서드의
@Override
protected void beforeConfigure() throws Exception {
if (this.authenticationManager != null) {
setSharedObject(AuthenticationManager.class, this.authenticationManager);
}
else {
ObservationRegistry registry = getObservationRegistry();
AuthenticationManager manager = getAuthenticationRegistry().build();
if (!registry.isNoop() && manager != null) {
setSharedObject(AuthenticationManager.class, new ObservationAuthenticationManager(registry, manager));
}
else {
setSharedObject(AuthenticationManager.class, manager);
}
}
}
가 호출되어 여기서
else 조건을 타 getSharedObject 로
AuthenticationManagerBuilder 빌더 클래스를
다시 꺼내와서 빌드를 하는데
이렇게 되면 http.build 과정의 인증관리자와
스프링컨테이너에 있는 인증관리자는
서로 다른건가요?
같다면 우리가 등록한 Bean이 build 과정에서 나올것같은데
못찾겠습니다 ㅠㅠ..
답변 2
0
네
configuration.getAuthenticationManager();
와 http.build() 에서의 AuthenticationManager 는 서로 다른 객체를 반환하고 생성되는 시점도 다릅니다
그래서 보통은 httpSecurity 를 통해서 AuthenticationManagerBuilder 를 가지고 와서 AuthenticationManager 를 생성하거나 참조하면 됩니다
다만 별도의 빈으로 생성할 경우
configuration.getAuthenticationManager()
를 사용해서 정의할 수 있는데 이 경우는 외부에서 주입받기 의한 목적이 크므로 httpSecurity 에서 생성한 객체와 다를지라도 큰 이슈가 없을 것 같은데요
상황에 따라 판단하셔야 할 것 같습니다
0
안녕하세요, 인프런 AI 인턴입니다.
smathj님이 질문하신 내용에 대해 설명드리겠습니다.
Bean으로 등록된 AuthenticationManager
와 HttpSecurity.build()
과정에서 사용되는 인증 관리자는 기본적으로 동일한 객체를 참조합니다. 이는 스프링 시큐리티의 컨텍스트 공유 메커니즘에 의해 관리되는데요.
우선, @Bean
으로 AuthenticationManager
를 등록하면, 스프링 컨테이너가 이를 관리하는 AuthenticationManager Bean을 하나 생성하여 관리합니다. 이후, HttpSecurity
설정 과정에서 authentictionManagerBean()
을 호출하거나, 직접 구현체를 주입하여 사용할 때, 스프링 시큐리티는 내부적으로 setSharedObject()
메서드를 통해 AuthenticationManager
를 공유 객체로 설정합니다. 이는 HttpSecurity
설정을 통해 구성되는 여러 필터들 사이에서 인증 관리자를 공유하기 위함입니다.
따라서, HttpSecurity.build()
로 빌드하는 과정에서 스프링 컨테이너 내에 등록된 AuthenticationManager
Bean을 가져와서 사용합니다. 이 과정에서 beforeConfigure()
메서드의 구현을 보면, 만약 authenticationManager
가 null
이 아니라면 이를 공유 객체로 설정하는 것을 확인할 수 있습니다. 이는 등록된 AuthenticationManager
Bean을 사용한다는 것을 의미합니다.
그래서, HttpSecurity.build()
과정에서 사용되는 AuthenticationManager
와 스프링 컨테이너에 등록된 AuthenticationManager
Bean은 같은 인스턴스를 참조합니다. 이는 스프링 시큐리티가 내부적으로 관리하는 인증 관리자를 커스텀하게 조작하거나 대체할 때 일관된 인스턴스를 사용하기 위해 설계된 것입니다.
결론적으로, smathj님이 질문하신 내용에서는 HttpSecurity.build()
과정과 스프링 컨테이너에 있는 인증 관리자가 같은 객체를 참조하게 됩니다. 관련 설정이나 커스텀 로직을 적용할 때 이 점을 유의하여 진행하시면 됩니다.
디버깅 하다 의문이 들었는데,
설명 해주셔서 감사합니다