작성
·
1.8K
0
답변 1
1
authenticationManangerBuilder.getObject().authenticate() 메소드가 실행되면
1. AuthenticationManager 의 구현체인 ProviderManager 의 authenticate() 메소드가 실행됩니다
2. 해당 메소드에선 AuthenticaionProvider 인터페이스의 authenticate() 메소드를 실행하는데
해당 인터페이스에서 데이터베이스에 있는 이용자의 정보를 가져오는 UserDetailsService 인터페이스를 사용합니다.
3. 그래서 UserDetailsService 인터페이스의 loadUserByUsername() 메소드를 호출하게 됩니다.
따라서 CustomUserDetailsService 구현체에 오버라이드된 loadUserByUsername() 메소드를 호출하게 되는 것입니다.
스프링 시큐리티의 아키텍처를 참고하시면 도움될것같습니다
https://lilly021.com/spring-security-architecture/
저도 위와 같은 증상이 발생하여, AuthenticationProvider 를 직접 구현하여 해결하였습니다.
직접 구현한 provider는 builder 내부에 등록
1.
public class CustomAuthenticationProvider implements AuthenticationProvider {}
2.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(customAuthenticationProvider);
}
위 내용은 근본적인 해결책이 아닌 일시적인 거라, 내부 클래스 다 뜯어서 해결했습니다.
원인은 UserDetailsService 를 구현한 객체가 2개라서 생성이 안되고 null로 들어가고 있었습니다.
@Order(InitializeUserDetailsBeanManagerConfigurer.DEFAULT_ORDER)
class InitializeUserDetailsBeanManagerConfigurer extends GlobalAuthenticationConfigurerAdapter {
private <T> T getBeanOrNull(Class<T> type) {
String[] beanNames = InitializeUserDetailsBeanManagerConfigurer.this.context.getBeanNamesForType(type);
if (beanNames.length != 1) {
return null;
}
return InitializeUserDetailsBeanManagerConfigurer.this.context.getBean(beanNames[0], type);
}
authenticationManangerBuilder.getObject() 이값이 NULL인경우는 무슨상황일까요??
객체가 제대로 주입되지 않은것같은데..