[Spring Security] 2개의 Authentication Manager를 Bean에 등록하는 방법

박소은·2024년 10월 8일
0

Spring Security

목록 보기
1/3
  1. Spring이 Bean에 등록할 때 이름을 따로 지정해주지 않으면 메서드명으로 등록된다.
  2. 두 AuthenticationManager의 이름을 다르게 지정한다.
  3. 각자 사용하는 UserDetailsService가 다르니, 이를 각각 설정해준다.
@Bean
// Primary 지정해버리면 다른 config 파일이더라도 무조건 이것만 사용된다. -> Bean에 이름 지정 필요
@Primary
public AuthenticationManager memberAuthenticationManager(HttpSecurity http) throws Exception {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(memberDefaultLoginService);
        provider.setPasswordEncoder(bCryptPasswordEncoder());
        return new ProviderManager(provider);
}

@Bean
public AuthenticationManager ownerAuthenticationManager(HttpSecurity http) throws Exception {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(ownerLoginService);
        provider.setPasswordEncoder(bCryptPasswordEncoder());
        return new ProviderManager(provider);
}
  1. @Qualifier를 통해 사용할 AuthenticationManager의 이름을 지정해준다.

  2. FilterChain에 AuthenticationManager authenticationManager만 파라미터로 넣어주면 @Primary로 지정한 AuthenticationManager만 들어간다. 다른 Security Config 파일을 사용해도 마찬가지다. 그래서 반드시 이름으로 둘을 구분하고, 하나의 config에서 둘 다 사용할 경우 둘 다 넣어줘야 한다.

  3. AuthenticationFilter의 경우 아래와 같이 authenticationManager의 authenticate을 통해 UserDetailsService를 호출하여 로그인 요청을 처리한다.

    *Authentication* authentication = authenticationManager.authenticate(authenticationToken);
  4. AuthorizationFilter의 경우 BasicAuthenticationFilter를 상속받는다. 이 필터가 내부에 AuthenticationManager를 갖고 있기 때문에 필요하다. → 🌟OncePerRequestFilter로 변경 가능할지?

  5. 위와 같은 이유로 두 개의 필터에서 모두 AuthenticationManager를 필요로 한다.

  6. Authentication Manager를 잘 맞게 넣어준다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http,
				@Qualifier("memberAuthenticationManager") AuthenticationManager memberAuthenticationManager,
        @Qualifier("ownerAuthenticationManager") AuthenticationManager ownerAuthenticationManager) throws Exception {

// form Login disable -> 해당 필터 사용할 수 있도록 추가, AuthenticationManager 넣어줘야 한다.

		MemberJwtAuthenticationFilter memberJwtAuthenticationFilter = new MemberJwtAuthenticationFilter(memberAuthenticationManager);
		MemberJwtAuthorizationFilter memberJwtAuthorizationFilter = new MemberJwtAuthorizationFilter(memberAuthenticationManager);

		OwnerJwtAuthenticationFilter ownerJwtAuthenticationFilter = new OwnerJwtAuthenticationFilter(ownerAuthenticationManager);
		OwnerJwtAuthorizationFilter ownerJwtAuthorizationFilter = new OwnerJwtAuthorizationFilter(ownerAuthenticationManager);
	 /*
	 * 생략 
	 */
}
profile
Backend Developer

0개의 댓글