Backend/spring

[spring security] 3. UserDetailsService, UserDetails

dddzr 2023. 8. 29. 17:25

UserDetailsService, UserDetails는 유저 정보를 가져와 비교하기 위해 쓰이는 인터페이스입니다.

 

1. UserDetailsService

UserDetailsService는 Spring Security가 사용자 정보를 가져오는 역할을 담당하는 인터페이스입니다. 보통 사용자 정보는 데이터베이스나 외부 인증 소스에서 가져오는데,

UserDetailsService 인터페이스 구현 시 오버라이드 되는 loadUserByUsername 메서드는

사용자 이름을 기반으로 사용자 정보를 조회하는 역할을 합니다.

public interface UserDetailsService {
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

loadUserByUsername 메서드는 사용자 이름(일반적으로는 사용자 ID 또는 이메일)을 받아서 해당 사용자에 대한 정보를 UserDetails 객체로 반환해야 합니다.

 

구현 예제입니다.

import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.core.userdetails.UserDetails;

public class CustomUserDetailsService implements UserDetailsService {

    // 사용자 정보를 가져오는 메서드
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 실제 데이터베이스나 다른 소스에서 사용자 정보를 조회하는 로직을 구현

        CustomUserDetails customUserDetails = new CustomUserDetails();
        customUserDetails.setUsername("user123");
        customUserDetails.setPassword("password");
        customUserDetails.setEmail("user123@example.com");
        // 권한 정보 등 설정

        return customUserDetails;
    }
}


2. UserDetails

UserDetails는 Spring Security가 사용자에 대한 정보를 저장하는 인터페이스입니다. 이 인터페이스는 사용자의 인증과 권한 정보를 제공합니다.

public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities(); //계정이 갖고있는 권한 목록을 리턴
    String getPassword(); //계정의 비밀번호를 리턴
    String getUsername(); //계정의 이름을 리턴
    boolean isAccountNonExpired(); //계정이 만료되지 않았는지 리턴(true: 만료안됨)
    boolean isAccountNonLocked(); //계정이 잠겨있지 않은지 리턴(true: 잠기지 않음)
    boolean isCredentialsNonExpired(); //비밀번호가 만료되지 않았는지 리턴(true: 만료안됨)
    boolean isEnabled(); //계정이 활성화(사용가능)됐는지 리턴(true: 활성화)
}

UserDetails 인터페이스는 다양한 메서드를 제공하여 사용자에 대한 정보를 관리합니다. 각 메서드는 사용자의 권한, 비밀번호, 계정의 유효성, 비밀번호의 유효성 등을 확인하고 반환합니다.

 

UserDetails 인터페이스에 기본으로 제공되는 멤버 변수 이외에 커스텀 데이터를 추가하려면, 이를 구현하는 클래스를 작성하고 해당 클래스에 추가 데이터를 포함시켜야 합니다. 

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

public class CustomUserDetails implements UserDetails {

    private String username;
    private String password;
    private String email; // 커스텀 데이터 필드
    private Collection<? extends GrantedAuthority> authorities;

    // 생성자, getter, setter 등은 생략

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    // UserDetails 인터페이스의 메서드 구현
    // ...
}