카테고리 없음

UserDetails, org.springframework.security.core.userdetails.User

dev.jelee 2024. 10. 28. 23:08

생각

UserDetails와 org.springframework.security.core.userdetails.User 관계가 궁금했다.

return으로 new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities); 이런 소스 코드를 작성했는데 org.springframework... 이게 뭔가 싶었다. 개발자가 만든 User객체가 아닌 다른 User에 값을 저장한다고 하니 궁금했다. 흠.. 너는 누구냐.


UserDetails 인터페이스

  • UserDetails는 Spring Security에서 사용자의 정보를 제공하기 위한 인터페이스다.
  • 사용자 이름, 비밀번호, 권한, 계정 상태 등의 정보를 외부에 제공하는 메서드의 계약을 정의합니다.
  • 인터페이스이므로 메서드만 있다.
  • 구현 클래스 필요한 인터페이스이므로, 실제로 이 정보를 담고 제공하는 클래스가 필요하다.

org.springframework.security.core.userdetails.User 클래스

  • User 클래스는 UserDetails 인터페이스를 구현한 구체적인 클래스이다.
  • Spring Security에서는 org.springframework.security.core.userdetails.User 클래스를 제공한다.
  • 사용자 정보를 저장하고, UserDetails 인터페이스에서 정의한 메서드를 구현하여 사용자 정보를 반환한다.
  • 필드와 메서드를 가지고 있다. -> 사용자 이름, 비밀번호, 권한 등의 필드를 가지고 있으며, 이 필드에 접근하기 위한 메서드를 구현한다.

필드:

  • username: 사용자 이름
  • password: 비밀번호
  • enabled: 계정 활성화 여부
  • accountNonExpired: 계정 만료 여부
  • accountNonLocked: 계정 잠금 여부
  • credentialsNonExpired: 비밀번호 만료 여부
  • authorities: 사용자의 권한 목록 (GrantedAuthority 객체로 구성)

필드 예시

public class User implements UserDetails {
    private final String username;               // 사용자 이름
    private final String password;               // 비밀번호
    private final boolean enabled;                // 계정 활성화 여부
    private final boolean accountNonExpired;      // 계정 만료 여부
    private final boolean accountNonLocked;       // 계정 잠금 여부
    private final boolean credentialsNonExpired;  // 비밀번호 만료 여부
    private final Collection<? extends GrantedAuthority> authorities;  // 사용자의 권한 목록

    // 생성자를 통해 필드 초기화
    public User(String username, String password, boolean enabled,
                boolean accountNonExpired, boolean accountNonLocked,
                boolean credentialsNonExpired, Collection<? extends GrantedAuthority> authorities) {
        this.username = username;
        this.password = password;
        this.enabled = enabled;
        this.accountNonExpired = accountNonExpired;
        this.accountNonLocked = accountNonLocked;
        this.credentialsNonExpired = credentialsNonExpired;
        this.authorities = authorities;
    }

    // getter 메서드들...
}
  • org.springframework.security.core.userdetails.User 클래스는 final 필드를 가지고 있기 때문에, 생성자를 통해서 필드를 초기화해야 한다. 생성자에서 모든 필드를 한 번에 설정할 수 있도록 설계되어 있다.

메서드:

  • 각 필드에 대한 getter 메서드. 예: getUsername(), getPassword(), getAuthorities()
  • setter 메서드는 보통 제공되지 않지만, 생성자를 통해 설정할 수 있다.
  • getUsername(): 사용자 이름을 반환.
  • getPassword(): 비밀번호를 반환.
  • isEnabled(): 계정 활성화 여부를 반환.
  • isAccountNonExpired(): 계정 만료 여부를 반환.
  • isAccountNonLocked(): 계정 잠금 여부를 반환.
  • isCredentialsNonExpired(): 비밀번호 만료 여부를 반환.
  • getAuthorities(): 사용자의 권한 목록을 반환.

메서드 예시

// 사용자 이름 반환
public String getUsername() {
    return username;
}

// 비밀번호 반환
public String getPassword() {
    return password;
}

// 계정 활성화 여부 반환
public boolean isEnabled() {
    return enabled;
}

// 계정 만료 여부 반환
public boolean isAccountNonExpired() {
    return accountNonExpired;
}

// 계정 잠금 여부 반환
public boolean isAccountNonLocked() {
    return accountNonLocked;
}

// 비밀번호 만료 여부 반환
public boolean isCredentialsNonExpired() {
    return credentialsNonExpired;
}

// 사용자의 권한 목록 반환
public Collection<? extends GrantedAuthority> getAuthorities() {
    return authorities;
}

 

요약

  • UserDetails: 사용자 정보를 제공하기 위한 인터페이스로, 메서드만 정의되어 있다.
  • User: UserDetails 인터페이스를 구현한 클래스이며, 실제 사용자 정보를 저장하고 반환하는 역할을 합니다. (필드, 메서드 정의되어 있음)

궁금

  • 수업을 하다가 이 소스 코드를 보았다. org.springframework.security.core.userdetails.User()는 이렇게 사용하는 건가?
// 예시
return new org.springframework.security.core.userdetails.User(
    user.getUsername(), 
    user.getPassword(), 
    user.isEnabled(), 
    true, 
    true, 
    true, 
    authorities
);

 

각 매개변수 설명

  1. username: 사용자 이름
  2. password: 비밀번호
  3. enabled: 계정이 활성화되어 있는지 여부
  4. accountNonExpired: 계정이 만료되지 않았는지 여부 (여기서는 항상 true)
  5. accountNonLocked: 계정이 잠겨있지 않은지 여부 (여기서는 항상 true)
  6. credentialsNonExpired: 비밀번호가 만료되지 않았는지 여부 (여기서는 항상 true)
  7. authorities: 사용자 권한 목록

왜 이렇게 작성하나요?

  • 간편성: Spring Security가 제공하는 User 클래스를 사용하면, 기본적인 사용자 정보를 쉽게 설정할 수 있다.
  • 유연성: 만약에 추가 필드가 필요하면 커스텀 클래스를 만들 수 있지만, 기본적인 요구 사항을 만족시키려면 이 클래스를 사용하는 게 좋다.

이렇게 작성하는 이유는 Spring Security의 기본 기능을 활용하면서, 사용자 정보를 설정하는 과정을 단순화하기 위해서다. 이 방식은 많은 경우에 유용하고, 이미 검증된 클래스이기 때문에 안정성도 높다.