로그인 시 jwt 토큰이 제대로 발급되지 않고 AuthenticationManagerBuilder.getObject()" is null
문제가 발생
UserDetatilsService를 상속한 클래스가 2개 이상이어서 생긴 문제였다. 다른 사람들이 찾아낸 이유를 보고 내 코드를 보면서도 내가 UserDetailsService를 여러개 implements 했다는 것을 깜빡하고 있었다.
클래스가 중복되니 spring은 둘 중 어느 것도 bean으로 등록해놓지 않은 것이다. 똑똑한 스프링부트..
@Service
@RequiredArgsConstructor
public class PrincipalDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
System.out.println("실행됨");
User user = userRepository.findByUserStrId(userId);
if(user == null) {
throw new UserNotFoundException(userId+"를 찾을 수 없습니다");
}
return new PrincipalDetails(user);
}
}
@Component("userDetailsService")
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
log.info("loadUserByUsername 실행됨");
return new PrincipalDetails(userRepository.findByUserStrId(userId));
}
원인 파악 출처
🗝️🗝️ UserDetailsService를 상속한 클래스 중 하나만 남겨주기 🗝️🗝️
@Component("userDetailsService")
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
log.info("loadUserByUsername 실행됨");
User user = userRepository.findByUserStrId(userId);
if(user == null) {
throw new UserNotFoundException(userId+"를 찾을 수 없습니다");
}
return new PrincipalDetails(user);
}
}
이젠 토큰을 정상적으로 발급해준다. 이전에 jwt + oauth를 적용하려 했을 때도 똑같은 문제가 발생했었는데 이제서야 해결을 해낸다. 이렇게 간단한 문제였다니 그때 그렇게 고생을 했던 내가 안타까워지지만 아마 그때로 돌아가도 난 원인을 파악하지 못했을 것이다. 완벽하게 했다고 할 순 없지만 다시 공부해서 흐름을 잘 잡은 덕에 지금 이 문제도 해결된 것이라 생각한다. 역시 사람이 겪는 일은 모두 시간이 걸리더라도 결국 언젠가 해결될 일들 뿐이라는 인생의 진리를 코딩하면서 느낀다. 이제.. 이전에 못했던 부분들 코드 전부 수정하러 가야겠다.
좋은 글이네요. 공유해주셔서 감사합니다.