인프런 커뮤니티 질문&답변

smathj님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

세션 생성 정책 - sessionManagement().sessionCreationPolicy()

AuthenticationManager에 초기화에 대해 질문있습니다

작성

·

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 에서 생성한 객체와 다를지라도 큰 이슈가 없을 것 같은데요

상황에 따라 판단하셔야 할 것 같습니다

smathj님의 프로필 이미지
smathj
질문자

디버깅 하다 의문이 들었는데,

설명 해주셔서 감사합니다

0

안녕하세요, 인프런 AI 인턴입니다.

smathj님이 질문하신 내용에 대해 설명드리겠습니다.

Bean으로 등록된 AuthenticationManagerHttpSecurity.build() 과정에서 사용되는 인증 관리자는 기본적으로 동일한 객체를 참조합니다. 이는 스프링 시큐리티의 컨텍스트 공유 메커니즘에 의해 관리되는데요.

우선, @Bean으로 AuthenticationManager를 등록하면, 스프링 컨테이너가 이를 관리하는 AuthenticationManager Bean을 하나 생성하여 관리합니다. 이후, HttpSecurity 설정 과정에서 authentictionManagerBean()을 호출하거나, 직접 구현체를 주입하여 사용할 때, 스프링 시큐리티는 내부적으로 setSharedObject() 메서드를 통해 AuthenticationManager를 공유 객체로 설정합니다. 이는 HttpSecurity 설정을 통해 구성되는 여러 필터들 사이에서 인증 관리자를 공유하기 위함입니다.

따라서, HttpSecurity.build()로 빌드하는 과정에서 스프링 컨테이너 내에 등록된 AuthenticationManager Bean을 가져와서 사용합니다. 이 과정에서 beforeConfigure() 메서드의 구현을 보면, 만약 authenticationManagernull이 아니라면 이를 공유 객체로 설정하는 것을 확인할 수 있습니다. 이는 등록된 AuthenticationManager Bean을 사용한다는 것을 의미합니다.

그래서, HttpSecurity.build() 과정에서 사용되는 AuthenticationManager와 스프링 컨테이너에 등록된 AuthenticationManager Bean은 같은 인스턴스를 참조합니다. 이는 스프링 시큐리티가 내부적으로 관리하는 인증 관리자를 커스텀하게 조작하거나 대체할 때 일관된 인스턴스를 사용하기 위해 설계된 것입니다.

결론적으로, smathj님이 질문하신 내용에서는 HttpSecurity.build() 과정과 스프링 컨테이너에 있는 인증 관리자가 같은 객체를 참조하게 됩니다. 관련 설정이나 커스텀 로직을 적용할 때 이 점을 유의하여 진행하시면 됩니다.

smathj님의 프로필 이미지

작성한 질문수

질문하기