스프링 시큐리티 공부하다가 UserDetailsService
의 loadUserByUsername(String username)
메소드의 리턴 값으로 어떨때는 UserDetails의 직접만든 구현객체를, 어떨 때는 User를 반환 해주는 경우를 봐서 왜 이렇게 하지라는 생각에 코드를 까서 확인해보니
public class User implements UserDetails, CredentialsContainer{
private String password;
private final String username;
private final Set<GrantedAuthority> authorities;
private final boolean accountNonExpired;
private final boolean accountNonLocked;
private final boolean credentialsNonExpired;
private final boolean enabled;
public User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
this(username, password, true, true, true, true, authorities);
}
...기타 코드들...
}
요런식으로 UserDetails에 정의되어 있던 내용들이 구현되어있었다.
즉 User는 UserDetails를 구현해둔 객체인 것인데,
굳이 UserDetails를 구현한 객체를 직접 만들지 않을 때 사용하는게 User인 것 같다.
추가적으로 로직을 더해서 미 로그인 몇일이면 정지되게 한다던지 등의 경우나 유저의 아이디나 비밀번호 외의 부가적인 정보를 시큐리티를 통해 사용하고 싶을 때에는 직접 UserDetails를 구현한 객체를 사용하면 될 것 같다.
쉽게 말하자면 UserDetails는 인터페이스, User는 그걸 구현해둔 객체!