UserDetailsService 구현

큰모래·2023년 4월 4일

UserDetailsService


개념

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

UserDetailsService 인터페이스에는 loadUserByUsername이라는 하나의 메서드가 존재한다.

이 메서드는 사용자의 username을 매개변수로 받아 UserDetails라는 객체를 반환한다.


UserDetails

UserDetails 객체는 인증에 필요한 사용자 정보권한 정보를 가지고 있다.

  • getAuthorities : 사용자의 권한 정보 리턴
  • getPassword : 사용자 비밀번호 리턴
  • getUsername : 사용자의 고유한 값을 리턴(중복이 없는 값)
  • isAccountNonExpired : 계정 만료 여부 리턴
  • isAccountNonLocked : 계정 잠김 여부 리턴
  • isCredentialsNonExpired : 비밀번호 만료 여부 리턴
  • isEnabled : 계정 활성화 상태 리턴

즉, UserDetailsService를 구현해 사용자 정보를 조회하여 UserDetails 객체를 반환하고, 스프링 시큐리티는 이 반환된 UserDetails를 토대로 인증 처리를 수행한다.


UserDetailsService 구현체 예제

@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());
    }
}
  • UserDetailsServiceloadUserByUsername 메서드를 오버라이드
  • 매개변수로 받은 username을 통해 userInfoRepository로 부터 Optional<UserInfo>객체를 리턴 받고, 만약 null 값을 받는다면 예외 처리
  • 스프링 시큐리티의 User 객체는 UserDetails의 구현체이다.
  • User 객체의 생성자 매개변수로 username, password, authorities 정보를 넣어 리턴할 수 있다.
profile
큰모래

0개의 댓글