UserDetailsService 구현

큰모래·2023년 4월 4일
0

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개의 댓글