사용자가 로그인 페이지에서 로그인 정보를 입력하면, 해당 정보를 바탕으로 인증을 진행한다. 스프링 시큐리티에서는 이때, 사용자 정보를 조회하기 위해 UserDetailsService 인터페이스를 구현하여 사용한다.

UserDetailsService 인터페이스에는 loadUserByUsername이라는 하나의 메서드가 존재한다.
이 메서드는 사용자의 username을 매개변수로 받아 UserDetails라는 객체를 반환한다.
UserDetails 객체는 인증에 필요한 사용자 정보와 권한 정보를 가지고 있다.
getAuthorities : 사용자의 권한 정보 리턴getPassword : 사용자 비밀번호 리턴getUsername : 사용자의 고유한 값을 리턴(중복이 없는 값)isAccountNonExpired : 계정 만료 여부 리턴isAccountNonLocked : 계정 잠김 여부 리턴isCredentialsNonExpired : 비밀번호 만료 여부 리턴isEnabled : 계정 활성화 상태 리턴
즉, UserDetailsService를 구현해 사용자 정보를 조회하여 UserDetails 객체를 반환하고, 스프링 시큐리티는 이 반환된 UserDetails를 토대로 인증 처리를 수행한다.
@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {
private final UserInfoRepository userInfoRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = userInfoRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("not found username : " + username));
return new User(userInfo.getUsername(), userInfo.getPassword(),
userInfo.getGrantedAuthorities());
}
}
UserDetailsService의 loadUserByUsername 메서드를 오버라이드username을 통해 userInfoRepository로 부터 Optional<UserInfo>객체를 리턴 받고, 만약 null 값을 받는다면 예외 처리User 객체는 UserDetails의 구현체이다.
User 객체의 생성자 매개변수로 username, password, authorities 정보를 넣어 리턴할 수 있다.