본문 바로가기
개발 일기/spring

Spring Security 설정 (Hierarchy)

by URMOO 2022. 9. 2.
반응형

보통의 경우라면, ADMIN권한을 가진 회원은 전체 url에 접근할 수 있고, USER권한을 가진 회원이라면 /admin url에는 접근하지 못한다.

권한이 몇개가 되었든 권한에 서열이 존재한다면 Hierarchy를 이용해 간단하게 권한을 설정할 수 있다.

본 포스팅의 코드는 여기서 확인 가능합니다😉

0. 시작 전

테스트를 위해 data.sql 파일에 아래와 같은 sql을 입력해주었다.

insert into public.authority (authority_id, role)
values (1, 'ROLE_ADMIN'),
       (2, 'ROLE_USER'),
       (3, 'ROLE_COMPANY');

insert into public.users (user_id, name, password, authority_id)
values (1, 'admin', 'admin', 1),
       (2, 'user', 'user', 2),
       (3,'company','company',3);

각 회원들은 이름에 맞는 권한을 가지며, 각 권한은 아래와 같이 접근 가능하다. 

권한 URL
ROLE_ADMIN /admin, /comapny, /user
ROLE_COMPANY /company, /user
ROLE_USER /user

1. 코드

우선, 기존의 SecurityConfigSecurityFilterChain을 수정해주어야한다.

SecurityConfig.java

 @Bean
  public SecurityFilterChain filterChain(HttpSecurity security) throws Exception {

  //...
    security.authorizeHttpRequests()
        .antMatchers("...").permitAll()
        //아래에서 입력했었던 antMatchers를 삭제한다. 
//        .antMatchers("/admin").hasRole("ADMIN")
//        .antMatchers("/user").hasRole("USER")
        .antMatchers("/**").permitAll()
        .anyRequest().authenticated()
    ;

//...
  }

그 후, 컨트롤러의 각 API에 @PreAuthorize어노테이션을 이용하여 API에 허용가능한 최소 권한을 입력해준다.

Contoller.java

@RestController
@RequiredArgsConstructor
public class Controller {
  //other codes... 

  @GetMapping("/company")
  @PreAuthorize("hasRole('COMPANY')")
  public String company() {
    return "company";
  }

  @GetMapping("/admin")
  @PreAuthorize("hasRole('ADMIN')")
  public String admin() {
    return "admin";
  }

  @GetMapping("/user")
  @PreAuthorize("hasRole('USER')")
  public String user() {
    return "user";
  }

}

그 다음, 다시 SecurityConfig로 돌아와 RoleHierarchy Bean을 생성해준다.

SecurityConfig.java

public class SecurityConfig{
 //Other Codes... 

  @Bean
  public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    //이 부분에서 큰 권한 순서로 ' > ' 를 사용하여 입력해준다. 띄어쓰기도 중요하다. 
    roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_COMPANY > ROLE_USER");
    return roleHierarchy;
  }

}

여기까지 완료했다면, 로그인 후 각 URL을 호출했을 때, 200이나 403의 상태를 얻는 것을 확인할 수 있다.

장점

권한의 서열(?)이 명확하다면, 코드한줄로 쉽게 인증권한을 설정할 수 있다.

단점

다채로운 설정이 불가능하다. 예를들면 POST와 GET의 권한 구분이라던가.. 그런 부분

기타

본 포스팅은 spring security 5.7.3 기준으로 작성되었다. (spring boot 2.7 이상)

만약 그 이하의 버전이라면 이 포스팅을 보고 참고하면 좋을 것 같다.

참고

https://www.baeldung.com/role-and-privilege-for-spring-security-registration

반응형

'개발 일기 > spring' 카테고리의 다른 글

Spring security (접근권한 변경)  (0) 2022.09.06
Spring Security 설정 (Dynamic)  (2) 2022.09.02
Spring Security 설정 (JWT 2)  (0) 2022.08.31
Spring Security 설정 (JWT 1)  (2) 2022.08.31
Spring Security 설정 (기본)  (2) 2022.08.31

댓글