보통의 경우라면, 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. 코드
우선, 기존의 SecurityConfig
의 SecurityFilterChain
을 수정해주어야한다.
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 |
댓글