• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@Component 로 된 Ajax Filter 에 Manager DI 방법 질문입니다

21.07.14 16:00 작성 조회수 232

0

좋은 강의 감사합니다.
응용 하던 중에 Bean 등록 시점에 애러가 나버렸어요.
AuthManager 주입을 받기위해 이런 시도를 해봤습니다

  • AjaxLoginProcessingFilter 를 @Component  로 등록할 될 경우
    Auth...Manager 를 필요로 하기때문에 서버 기동이 안됩니다.
    때문에 SecurityConfig 에서 참조가능한 AuthManager 를 아래와 같이 @Bean 으로 등록 후,
    외부에서 주입받도록 했었습니다.
public class AjaxSecurityConfig extends WebSecurityConfigurerAdapter {

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}

결과 :  Config  <  >  AjaxFilter  순환참조가 발생했습니다 -`서버기동 실패`
그래서 이 방법은 적용하지 않았습니다

일관적이게 코딩하려다 보니, SecurityConfig 자원들을 생성자 DI 로 주입받다가
갑자기 @Bean 으로 등록하는 것이 잘 하는건지 잘모르겠습니다만,
지금 은 실습 예제와 같이 설정 후 정상작동 중이긴 합니다.

public class AjaxSecurityConfig extends WebSecurityConfigurerAdapter {

...

@Bean
public Filter ajaxLoginProcessingFilter() throws Exception {
final AjaxLoginProcessingFilter filter = new AjaxLoginProcessingFilter();
filter.setAuthenticationManager(authenticationManagerBean());
return filter;
}
}


질문입니다.

  • 제가 시도한 방법으로는 반드시 Config 내부에 @Bean 등록을 거쳐야
    Filter 등록이 가능한데요,
    AuthManager 를 `순환 참조없이` 외부에서 DI 받는 방법은 없나요?


읽어주셔서 감사합니다

답변 1

답변을 작성해보세요.

1

AuthenticationManager 는 스프링 시큐리티에서 초기화 시 생성하게 되는데 이 때 빈으로 생성하지 않고 일반 객체로 생성합니다.

그리고 굳이 빈으로 생성할 필요가 없습니다.

AjaxLoginProcessingFilter 또한 빈으로 생성할 필요도 없습니다.

모두 초기화 시 생성되고 나서는 이 객체들을 참조해할 할 경우가 거의 없기 때문입니다.

그래서 스프링 시큐리티는 HttpSecurity 에 있는 SharedObjects 를 가지고 여기에 여러 객체들을 넣어두고 참조하는 식으로 운용합니다. 즉 빈이 아닌거죠

다만 빈으로 생성하는 이유가 여러 위치에서 DI 기능을 사용하기 위함이겠죠

일단 

@Bean

   @Override

   public AuthenticationManager authenticationManagerBean() throws Exception {

      return super.authenticationManagerBean();

   }

식으로 빈을 생성하는 것은 맞습니다.

근데 빈을 서로간 주입받다가 발생하는 오류라면 특별한 해결책이 있다기 보다는 스프링의 빈 라이프 사이클에 맞게끔 구성하는 수 밖에 없습니다.

Truestar님의 프로필

Truestar

질문자

2021.07.21

답글감사합니다.

Security 는 초기화에 사용되는 객체는 @Bean 이 아니라,
POJO 기반이기 때문에  주입에 관한 기능이 없어, `SharedObject 로 운영된다`라는 말씀이시군요,
초기화 과정을 파악하는것에 큰 도움이 되었습니다.

@Bean 생성으로도 초기화가 가능은 하지만, 해결해야 될 문제가 생기고,
불필요한 리소스 낭비가 될수도 있다는 뉘앙스로도 느껴집니다.

우문 현답 해주셨네요. 감사합니다.