Spring/security

[시큐리티] UserDetailsService

라임온조 2023. 3. 13. 18:05

1. UserDetails

1) 개념

스프링 시큐리티가 관리하는 사용자를 나타냄

2) 특징

  • 하나 이상의 권한을 가짐
  • UserDetails 계약을 구현해서 프레임워크가 이해할 수 있게 사용자를 기술

3) UserDetails 인터페이스 코드

public interface UserDetails extends Serializable {
	// 인증과 관련된 세부 정보, 사용자 자격 증명을 반환하는 메서드
	String getUsername(); // 사용자 이름 반환
    String getPassword(); // 사용자 암호 반환
    
    // 사용자가 애플리케이션의 리소스에 접근할 수 있도록 권한 부여하기 위한 메서드
    Collection<? extends GrantedAuthority> getAuthorities(); // 사용자에게 부여된 권한의 그룹 반환
    boolean isAccountNonExpired(); // 계정 만료
    boolean isAccountNonLocked(); // 계정 잠금
    boolean isCredentialsNonExpired(); // 자격 증명 만료
    boolean isEnabled(); // 계정 비활성화
}

2. UserDetailsService

1) 개념

사용자 이름으로 사용자 세부 정보를 검색하는 객체

2) 인터페이스 코드

public interface UserDetailsService {
	// 주어진 사용자 이름을 가진 사용자의 세부 정보를 얻음
	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

3. UserDetailsManager

1) 개념

UserDetailService 계약을 확장해서 사용자 추가, 수정, 삭제 작업

2) 인터페이스 코드

public interface UserDetailsManager extends UserDetailService {
	void createUser(UserDetails user);
    void updateUser(UserDetails user);
    void deleteUser(String username);
    void changePassword(String oldPassword, String newPassword);
    boolean userExists(String username);
}

3) 종류

InMemoryUserDetailsManager

JdbcUserDetailsManager

  • sql 데이터베이스에 저장된 사용자를 관리하며 jdbc를 통해 데이터베이스에 직접 연결
  • JDBC를 직접 이용하므로 애플리케이션이 다른 프레임워크에 고정되지 않는다는 이점이 있다

LdapUserDetailsManager

  • LDAP용 UserDetailsManager
  • 사용자 관리를 위해 LDAP 시스템을 통합해야 할 때 유용

4. GrantedAuthority

1) 개념

사용자가 수행할 수 있는 작업을 GrantedAuthority 인터페이스로 나타냄

2) 특징

UserDetails에 이용됨

3) 인터페이스 코드

public interface GrantedAuthority extends Serializable {
	String getAuthority();
}


// getAuthority는 람다를 이용해 구현하거나, SimpleGrantedAuthority 클래스 이용해 구현 가능
GrantedAuthority g1 = () -> "READ";
GrantedAuthority g2 = new SimpleGrantedAuthority("READ");