사용자 관리

3.1. 스프링 시큐리티의 인증 구현

스프링 시큐리티의 인증 흐름

  1. AuthenticationFilter가 요청을 가로챈다.

  2. AuthenticationManager에 위임한다.

  3. AuthenticationManager는 AuthenticationProvider를 이용해 인증 논리를 구현한다.

  4. AuthenticationProvider는 사용자 이름과 암호를 확인하기 위해 UserDetailsService, PasswordEncoder를 이용한다.

사용자 관리에는 UserDetailsService, UserDetailsManager를 사용한다.

  • UserDetailsService

    • 사용자 이름으로 사용자를 검색한다.

  • UserDetailsManager

    • 사용자 추가, 수정, 삭제 작업을 한다.

둘은 인터페이스 분리 원칙을 지켜 필요없는 동작은 구현하지 않아도 된다.

  • UserDetails

    • UserDetailsService, UserDetailsManager에 사용자를 나타내는 방법

    • GrantedAuthority 인터페이스로 권한을 나타낸다.

      • 유저는 하나 이상의 권한을 가진다.

3.2. 사용자 기술하기

스프링 시큐리티에서 사용자 정의는 UserDetails 계약을 준수해야 한다.

3.2.1. UserDetails 계약의 정의 이해하기

  • getUsername()

  • getPassword()

  • getAuthorities()

  • isAccountNotExpired()

    • 계정 만료

  • isAccountNonLocked()

    • 계정 잠금

  • isCredentialsNonExpired()

    • 자격 증명 만료

  • isEnabled()

    • 계정 비활성화

아래의 4개 메서드는 구현할 필요가 없다면 단순하게 true를 반환하면 된다.

3.2.2. GrantedAuthority 계약 살펴보기

GrantedAuthority g1 = new SimpleGrantedAuthority("READ");
  • GrantedAuthority.getAuthority()로 권한을 확인한다.

  • SimpleGrantedAuthority로 권한을 생성할 수 있다.

3.2.3. 최소한의 UserDetails 구현 작성

public class SimpleUser implements UserDetails {

    private final String username;
    private final String password;

    @Override
    public String username() {
        return this.username;
    }
    
    ...
}

3.2.4. 빌더를 이용해 UserDetails 형식의 인스턴스 만들기

// 사용자 생성
UserDetails u1 = User.withUsername("bill")
        .password("12345")
        .authorities("read", "write")
        .passwordEncoder(p -> encode(p))
        .build();

// 기존 인스턴스에서 사용자 생성
UserDetails u2 = User.withUserDetails(u).build();

3.2.5. 사용자와 연관된 여러 책임 결합

  • JPA 사용을 담당하는 엔티티 User와 UserDetails를 구현한 User는 분리해서 구현한다.

3.3. 스프링 시큐리티가 사용자를 관리하는 방법 지정

3.3.1. UserDetailsService 계약의 이해

  • loadUserByUsername()

    • 사용자 이름을 가진 사용자의 세부 정보를 얻는다.

    • 존재하지 않으면 UsernameNotFoundException

3.3.2. UserDetailsService 계약 구현

  • InMemoryUserDetailsManager

  • JdbcUserDetailsManager

  • LdapUserDetailsManager

Last updated

Was this helpful?