# Back-End/Spring

Role Enum 클래스를 이용한 인가

Role Enum이란

 

@Getter
@RequiredArgsConstructor
public enum Role {
    TYPE1("USER1"),
    TYPE2("USER2"),
    TYPE3("ADMIN")
}

Role이란 시스템을 사용하는 사용자의 역할을 말한다. 그 자체만으로 권한으로 사용할 수 있고 Depth를 한단계 더 두면 각 역할의 권한을 따로 설정할 수도 있다.

(Ex : USER1, USER2는 읽기 권한, ADMIN은 읽기/쓰기 권한)

 

 

Role Enum의 목적

시스템 사용자의 각각 역할에 대해서 어떤 권한을 사용할 지 관리하는 것을 용이하게 함

 

 

Spring Security에서 Role을 통해 인증하는 과정

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .and()
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("TYPE3")
                .antMatchers("/something/**").hasAnyRole("TYPE1", "TYPE2")

Spring Security 설정 중 antMatchers를 이용해서 어떤 경로에 대해 Role을 가진 사용자만 접근 가능하도록 설정할 수 있다.

 

 

용자가 권한을 가지고 있는 지를 확인하는 절차

  1. 서버에 권한이 필요한 요청이 들어온다.
  2. Spring Security에 등록된 인증 Filter 혹은 인증 Interceptor가 요청을 가로채 인증을 시도한다.
    1. Security Context에 등록된 인증정보 Authentication을 읽어온다.
    2. Authentication의 getAuthorities() 를 통해 권한을 읽어온 후 권한을 확인한다.
    3. 권한이 있다면 인가하고, 없다면 Access를 deny 한다.
  3. 권한이 있어 인가되면 요청을 수행한다.

 

인가를 위한 인증 정보(Authentication) 등록

/**
* 참고 : org.springframework.security.core 패키지의 Authentication 인터페이스
*/

package org.springframework.security.core;

public interface Authentication extends Principal, Serializable {
    ...
		
    Object getPrincipal();
    Object getCredentials();
    Collection<? extends GrantedAuthority> getAuthorities();
}
  1. 인증과 인가를 위해서 Authentication이라는 인증 정보를 Security Context에 등록해야 한다.
  2. Authentication은 Principal, Credential, Authorities 세 가지로 구성되어 있는데, 이때 권한 정보를 담는 Authorities 에 사용자의 Role을 담아줘야 한다.
  3. 문자열 “ROLE_ADMIN”이 아닌 “ADMIN”을 저장해야 하는데, “ROLE_” 접두사는 Spring Security에서 자동으로 붙여주기 때문이다.
728x90