카테고리 없음

SpringBoot - security.authentication.InternalAuthenticationServiceException: null

socialcomputer 2022. 4. 13. 17:17
반응형
2022-03-31 21:35:08.076 ERROR 4740 --- [nio-8088-exec-4] w.a.UsernamePasswordAuthenticationFilter : An internal error occurred while trying to authenticate the user. org.springframework.security.authentication.InternalAuthenticationServiceException: null at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:108) ~[spring-security-core-5.6.1.jar:5.6.1] at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(Abstrac
---------             ---------               -------    중 략     ---------          ----------           --------     
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

Caused by: java.lang.NullPointerException: null at
com.example.myproject.config.auth.PrincipalDetailsService.loadUserByUsername(PrincipalDetailsService.java:23) ~[classes/:na] at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:93) ~[spring-security-core-5.6.1.jar:5.6.1] ... 60 common frames omitted

 

이 문제는 authentication 객체가 null이 되어 생긴 오류다. 일반로그인 서비스를 수정했다. 

회원저장소에서 찾지 못하면 로그인 실패가 되도록 해야 하는데

예전 코드는 return null 을 해줘서 null인 인증객체가 들어가 오류가 난 것 같다. 

그래서 유저를 찾을수 없다는 로그인실패 예외를 던져 해결했다.

if ( userRepository.findByUsername(username)==null ){
    throw new UsernameNotFoundException(username)
}

아래는 수정한 코드이다. 

/**
 * 일반 로그인, 자동 로그인 (자동 회원가입x)
 */
@RequiredArgsConstructor
@Service
public class PrincipalDetailsService implements UserDetailsService {
    private final UserRepository userRepo;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 로그인시키기
        System.out.println(username);
        User entity = userRepo.findByUsername(username);
        System.out.println("loadUserByUsername: "+entity.getUsername()+","+ entity.getEmail()+","+ entity.getPassword());
        if(entity==null){
            throw new UsernameNotFoundException(username);
            // 로그인 실패시 예외 던지기
        }
        return new PrincipalDetails(entity);
    }

}

 

 

반응형