m1ndy5's coding blog

Spring Security UserDetails, UserDetailsService 본문

백엔드 with java/spring

Spring Security UserDetails, UserDetailsService

정민됴 2023. 10. 11. 22:33

UserDetail

Spring Security에서 사용자의 정보를 담는 인터페이스

@Data
public class PrincipalDetails implements UserDetails{

    private static final long serialVersionUID = 1L;

    private User user;

    public PrincipalDetails(User user) {
        this.user = user;
    }

    // 권한 : 한개가 아닐 수 있어서 Collection 타입으로 return
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> collector = new ArrayList<>();
        collector.add(() -> {return user.getRole();});
        return collector;
    }

    // 계정 비밀번호
    @Override
    public String getPassword() {
        return user.getPassword();
    }

    // 계정의 고유한 값 (중복 x)
    @Override
    public String getUsername() {
        return user.getUsername();
    }

    // 계정 만료 여부
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    // 계정 잠김 여부
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    // 비밀번호 만료 여부
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    // 계정 활성화 여부
    @Override
    public boolean isEnabled() {
        return true;
    }

}

UserDetailService

Spring Security에서 유저의 정보를 가져오는 인터페이스

@RequiredArgsConstructor
@Service
public class PrincipalDetailsService implements UserDetailsService {

        private final UserRepository userRepository;

        // 1. 패스워드는 알아서 체킹하니까 신경쓸 필요 없다.
        // 2. 리턴이 잘되면 자동으로 UserDetails 타입을 세션으로 만든다.
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{

            User userEntity = userRepository.findByUsername(username);

            if(userEntity == null) {
                return null;
            } else {
                return new PrincipalDetails(userEntity);
            }    
        }
}

** 후에 Spring Security 동작 원리 정리 필요 **