반응형
Spring Security에서 메서드 수준 접근 제어를 위해 사용되는 어노테이션들이 있습니다. 이 어노테이션들을 사용하여 메서드의 실행 전후에 인가 검사를 수행하여 접근 권한을 제어할 수 있습니다.
@PreAuthorize
메소드가 실행되기 전에 인가(Authorization)를 검사하는데 사용됩니다. 메소드의 실행 전에 지정된 스프링 EL(SpEL) 표현식을 평가하고, 표현식이 true인 경우에만 메소드가 실행됩니다. 인가 검사를 통과하지 못하면 예외가 발생하며, 메소드 실행은 중지됩니다.
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteUser(int userId) {
// ...
}
@PostAuthorize
메소드 실행 후에 인가(Authorization)를 검사하는데 사용됩니다. 메소드의 실행이 완료된 후에 지정된 스프링 EL 표현식을 평가하고, 표현식이 true인 경우에만 메소드의 결과를 반환합니다. 인가 검사를 통과하지 못하면 예외가 발생하며, 메소드의 결과는 제공되지 않습니다.
@PostAuthorize("returnObject.userId == authentication.principal.username")
public Order getOrder(int orderId) {
// ...
return order;
}
`getOrder` 메서드가가 실행된 후에 현재 사용자가 주문의 소유자인지 검사합니다. 주문의 소유자가 아닌 경우 예외가 발생하고, 메서드의 결과가 제공되지 않습니다.
@Secured
Spring Security에서 메소드 수준의 접근 제어를 구현하기 위해 사용되는 어노테이션입니다. 이 어노테이션을 메소드에 추가하여 해당 메소드에 접근할 수 있는 권한을 명시적으로 지정할 수 있습니다.
@Secured("ROLE_ADMIN")
public void adminOnlyAccessMethod() {
// ...
}
`@Secured({"ROLE_ADMIN, "ROLE_MANAGER"})` 과 같이 여러 개의 권한을 지정할 수도 있습니다.
설정 방법!!
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
}
표현식
@PreAuthorize("isAuthenticated()")
@PreAuthorize("hasRole('ROLE_ADMIN')")
@PreAuthorize("hasAnyRole('ROLE_ADMIN', ''ROLE_MEMBER')")
@PreAuthorize("principal.username == #member.name")
표현식 | 설명 |
hasRole([role]) hasAuthority([authority]) |
권한이 지정된 권한인 경우 true |
hasAnyRole([role1,role2]) hasAnyAuthority([authority]) |
여러 권한 중 해당 하는 권한이 있는 경우 true |
principal | 현재 사용자 정보(User)를 직접 접근할 수 있다. |
permitAll | 모든 사용자 허용 |
denyAll | 모든 사용자 거부 |
authentication |
SecurityContext에 있는 authentication 객체에 접근 가능 |
isAnonymous() | 익명(로그인하지 않은) 상태인 경우 true |
isAuthenticated() | 인증된(로그인 한) 상태인 경우 true |
isRememberMe() | Remember-me 사용자인 경우 true |
isFullyAuthenticated() | Remember-me 사용자는 아니지만 인증된(로그인 한) 상태인 경우 true |
hasRole를 사용하는 경우 표현식 지정시 앞에 접두어인 'ROLE_'을 생략해줄 수 있다.
반응형
'Spring Security' 카테고리의 다른 글
WebSecurityConfigurerAdapter Deprecated (0) | 2022.10.14 |
---|---|
Spring Security 프로젝트 시작 (0) | 2022.10.14 |
Spring Security Session을 이용한 구현 예제 (0) | 2022.09.29 |
Spring Security 스프링 시큐리티 이해하기 (0) | 2022.09.29 |
Spring Security 스프링 시큐리티 설정 (0) | 2022.09.09 |