@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);
}
@Qualifier
를 통해 사용할 AuthenticationManager의 이름을 지정해준다.
FilterChain에 AuthenticationManager authenticationManager
만 파라미터로 넣어주면 @Primary
로 지정한 AuthenticationManager만 들어간다. 다른 Security Config 파일을 사용해도 마찬가지다. 그래서 반드시 이름으로 둘을 구분하고, 하나의 config에서 둘 다 사용할 경우 둘 다 넣어줘야 한다.
AuthenticationFilter의 경우 아래와 같이 authenticationManager의 authenticate을 통해 UserDetailsService를 호출하여 로그인 요청을 처리한다.
*Authentication* authentication = authenticationManager.authenticate(authenticationToken);
AuthorizationFilter의 경우 BasicAuthenticationFilter를 상속받는다. 이 필터가 내부에 AuthenticationManager를 갖고 있기 때문에 필요하다. → 🌟OncePerRequestFilter로 변경 가능할지?
위와 같은 이유로 두 개의 필터에서 모두 AuthenticationManager를 필요로 한다.
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);
/*
* 생략
*/
}