생각
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
);
각 매개변수 설명
- username: 사용자 이름
- password: 비밀번호
- enabled: 계정이 활성화되어 있는지 여부
- accountNonExpired: 계정이 만료되지 않았는지 여부 (여기서는 항상 true)
- accountNonLocked: 계정이 잠겨있지 않은지 여부 (여기서는 항상 true)
- credentialsNonExpired: 비밀번호가 만료되지 않았는지 여부 (여기서는 항상 true)
- authorities: 사용자 권한 목록
왜 이렇게 작성하나요?
- 간편성: Spring Security가 제공하는 User 클래스를 사용하면, 기본적인 사용자 정보를 쉽게 설정할 수 있다.
- 유연성: 만약에 추가 필드가 필요하면 커스텀 클래스를 만들 수 있지만, 기본적인 요구 사항을 만족시키려면 이 클래스를 사용하는 게 좋다.
이렇게 작성하는 이유는 Spring Security의 기본 기능을 활용하면서, 사용자 정보를 설정하는 과정을 단순화하기 위해서다. 이 방식은 많은 경우에 유용하고, 이미 검증된 클래스이기 때문에 안정성도 높다.