Spring Security를 사용하는 웹 애플리케이션에서는 UserDetails 인터페이스를 구현하는 클래스를 사용하는 것이 일반적이다.
Spring Security에서 UserDetails
인터페이스는 사용자의 정보를 나타내는 역할을 한다.
이 인터페이스를 구현하는 클래스의 객체는 현재 로그인한 사용자의 세부 정보를 Spring Security에 제공한다.
UserDetails
인터페이스에는 다음과 같은 메소드들이 정의되어 있다:
Collection<? extends GrantedAuthority> getAuthorities()
: 사용자가 가진 권한을 반환한다.String getPassword()
: 사용자의 비밀번호를 반환한다.String getUsername()
: 사용자 이름(보통 로그인 ID)을 반환한다.boolean isAccountNonExpired()
: 계정이 만료되지 않았음을 확인한다.boolean isAccountNonLocked()
: 계정이 잠기지 않았음을 확인한다.boolean isCredentialsNonExpired()
: 자격 증명(비밀번호 등)이 만료되지 않았음을 확인한다.boolean isEnabled()
: 계정이 활성화 상태임을 확인한다.다음은 UserDetails 인터페이스를 구현하는 간단한 예제 코드다:
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import java.util.Collection;
import java.util.Collections;
@Entity
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private boolean enabled;
// ... getters and setters ...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.singleton(new SimpleGrantedAuthority("USER"));
// 여기서는 단순하게 "USER" 권한만 부여했다. 실제로는 DB에서 해당 유저가 가진 권한들을 불러와야 한다.
}
@Override
public boolean isAccountNonExpired() {
return true; // 실제로는 DB에서 해당 정보를 불러와야 한다.
}
@Override
public boolean isAccountNonLocked() {
return true; // 실제로는 DB에서 해당 정보를 불러와야 한다.
}
@Override
public boolean isCredentialsNonExpired() {
return true; // 실제로는 DB에서 해당 정보를 불러와야 한다.
}
}
위 예시 코드에서, 각 메소드가 단순하게 상수 값을 반환하도록 작성되었다. 하지만 실제 애플리케이션에서 이 메소드들은 보통 데이터베이스 또는 다른 저장소에서 사용자 정보를 조회하여 그 결과를 반환하도록 구현해야 한다. 예를 들어,
getAuthorities()
메소드는 사용자가 가진 모든 권한을 데이터베이스에서 조회하여 반환해야 한다.또한, 이
UserDetails
인터페이스를 구현하는 클래스의 객체는 보통UserDetailsService
인터페이스를 구현하는 서비스 클래스에서 로드된다. 이 서비스 클래스는 Spring Security 설정에서 지정되며, 로그인 시에 입력된 사용자 이름을 기반으로 해당 사용자의UserDetails
객체를 로드하는 역할을 한다.