사용자가 로그인 페이지에서 로그인 정보를 입력하면, 해당 정보를 바탕으로 인증을 진행한다. 스프링 시큐리티에서는 이때, 사용자 정보를 조회하기 위해 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
정보를 넣어 리턴할 수 있다.