메소드별 권한 설정을 할 순 없을까? 🧐
가계부 앱 관련 프로젝트를 진행하던 중, 카테고리 조회는 모든 계정이 카테고리 생성은 관리자 권한만 가능하게 하고 싶었다. 스프링 시큐리티 설정에서 엔드포인트별 권한 설정을 하는 방법만 알아서 .. 방법이 있나 찾아보던 중Method Security
를 알게되어 정리하고자 한다 !
Spring Security
는 웹 애플리케이션에서 API
경로나 URL
에 대한 권한을 부여하는 것 외에도, 메소드 레벨의 보안을 제공한다. @PreAuthorize
, @PostAuthorize
, @Secured
와 같은 어노테이션으로 제어 할 수 있다.dependencies {
implementation("org.springframework.boot:spring-boot-starter-security")
}
@EnableWebSecurity
@EnableMethodSecurity
securedEnabled
: @Secure 애노테이션 사용가능 여부에 대한 속성default
는 false
prePostEnabled
: @PreAuthorize
, @PostAuthorize
애노테이션 사용가능 여부에 대한 속성default
는 true
authorizeRequest
에서의 permitAll()
은 명시적인 선언에 불과하며, 이후 접근 제어는 각 api 메소드 별로 수행한다.// SecurityConfig.kt
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
class SecurityConfig {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http
/*
...
*/
.authorizeHttpRequests { authorizeHttpRequests ->
authorizeHttpRequests
.requestMatchers("/api/v1/category/**")
.permitAll()
}
}
}
@Secured("ROLE_ADMIN")
@GetMapping("/info")
public @ResponseBody String info() {
return "개인정보";
}
@PreAuthorize("hasAnyRole('ROLE_MANAGER', 'ROLE_ADMIN')")
@GetMapping("/data")
public @ResponseBody String data() {
return "데이터정보";
}
@PreAuthorize
: 메서드가 실행되기 전에 인증을 거친다.@PostAuthorize
: 메서드가 실행되고 나서 응답을 보내기 전에 인증을 거친다.✅ 사용 가능한 표현식
hasRole([role])
: 현재 사용자의 권한이 파라미터의 권한과 동일한 경우 truehasAnyRole([role1,role2 ...])
: 현재 사용자의 권한 파라미터의 권한 중 일치하는 것이 있는 경우 trueprincipal
: 사용자를 증명하는 주요객체(User)를 직접 접근할 수 있다.authentication
:SecurityContext
에 있는authentication
객체에 접근 할 수 있다.permitAll
: 모든 접근 허용denyAll
: 모든 접근 비허용isAnonymous()
: 현재 사용자가 익명(비로그인)인 상태인 경우 trueisRememberMe()
: 현재 사용자가 RememberMe(로그인 정보 저장) 사용자라면 trueisAuthenticated()
: 현재 사용자가 익명이 아니라면 (로그인 상태라면) trueisFullyAuthenticated()
: 현재 사용자가 익명이거나 RememberMe 사용자가 아니라면 true
출처
SecurityConfig Spring Method Security 적용하기
스프링 시큐리티에서의 메소드 레벨 보안
[Spring Security] 4. 권한 처리
[공부정리] @Secured(), @PreAuthorize, @PostAuthorize