
메소드별 권한 설정을 할 순 없을까? 🧐
가계부 앱 관련 프로젝트를 진행하던 중, 카테고리 조회는 모든 계정이 카테고리 생성은 관리자 권한만 가능하게 하고 싶었다. 스프링 시큐리티 설정에서 엔드포인트별 권한 설정을 하는 방법만 알아서 .. 방법이 있나 찾아보던 중Method Security를 알게되어 정리하고자 한다 !
Spring Security는 웹 애플리케이션에서 API 경로나 URL에 대한 권한을 부여하는 것 외에도, 메소드 레벨의 보안을 제공한다. @PreAuthorize, @PostAuthorize, @Secured와 같은 어노테이션으로 제어 할 수 있다.dependencies {
implementation("org.springframework.boot:spring-boot-starter-security")
}
@EnableWebSecurity@EnableMethodSecuritysecuredEnabled: @Secure 애노테이션 사용가능 여부에 대한 속성default는 falseprePostEnabled: @PreAuthorize, @PostAuthorize 애노테이션 사용가능 여부에 대한 속성default는 trueauthorizeRequest에서의 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