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

이삐삐님의 프로필 이미지
이삐삐

작성한 질문수

Spring Boot JWT Tutorial

DTO, Repository, 로그인

AuthController에서 loadByUsername 메서드 실행 경로

작성

·

1.8K

0

authenticationManagerBuilder.getObject().authenticate(authenticationToken);이 실행되면 loadUserByUsername으로 어떻게 넘어가지는지 이해가 되지 않습니다. loadUserByUsername은 customUserDatailSevice의 메서드인데 어째서 authenticationdml authentiacate메서드를 실행하면 CustomUserDatailService의 메서드가 호충되는 건가요?

답변 1

1

authenticationManangerBuilder.getObject().authenticate() 메소드가 실행되면

1. AuthenticationManager 의 구현체인 ProviderManager 의 authenticate() 메소드가 실행됩니다

2. 해당 메소드에선 AuthenticaionProvider 인터페이스의 authenticate() 메소드를 실행하는데

해당 인터페이스에서 데이터베이스에 있는 이용자의 정보를 가져오는  UserDetailsService 인터페이스를 사용합니다.

3. 그래서 UserDetailsService 인터페이스의 loadUserByUsername() 메소드를 호출하게 됩니다.

따라서 CustomUserDetailsService 구현체에 오버라이드된 loadUserByUsername() 메소드를 호출하게 되는 것입니다.

 

스프링 시큐리티의 아키텍처를 참고하시면 도움될것같습니다

https://lilly021.com/spring-security-architecture/

authenticationManangerBuilder.getObject() 이값이 NULL인경우는 무슨상황일까요?? 

객체가 제대로 주입되지 않은것같은데..

저도 위와 같은 증상이 발생하여, 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);
}

잘 보고 갑니다

감사합니다.

이삐삐님의 프로필 이미지
이삐삐

작성한 질문수

질문하기