1.메서드 기반 권한부여
1.메서드 기반 권한 부여 활성화
메서드 기반 권한 부여 방식을 통해 보다 상세한 권한 부여를 적용하기 위해서는 다음의 설정을 활성화 해야 함
@EnableMethodSecurity // 메서드 기반 권한 부여 활성화
@Configuration
public class SecurityConfig {
}위 Annotation을 활성화 하였을 경우, 다음의 Annotation들을 통해 권한 부여에 활용할 수 있음
@PreAuthorize, @PostAuthorize, @PreFilter, and @PostFilter
Spring Security는 메서드 레벨의 권한 부여 옵션은 기본값으로 비활성화 되어 있음
2. 메서드 기반 권한 부여의 동작 방식
메서드 기반 권한 부여는 Spring AOP 메커니즘에 의해 동작함
또한 권한 부여를 적용하기 위해 대상 메서드(Target)가 호출되기 전/후 과정을 통해 권한을 확인, 부여함
@Service
public class MyCustomerService {
@PreAuthorize("hasAuthority('permission:read')")
@PostAuthorize("returnObject.owner == authentication.name")
public Customer readCustomer(String id) { ... }
}MyCustomerService.readCustomer()가 호출되었을 때 동작 방식

- Spring AOP는
readCustomer()에 대한 프록시 메서드(Proxy method)를 호출,Proxy의 어드바이저 내에서
@PreAuthorize포인트컷과 일치하는AuthorizationManagerBeforeMethodInterceptor를 호출함
인터셉터는
PreAuthorizeAuthorizationManager의check(Supplier<Authentication> authentication, ...)를 호출하여Authentication객체가@PreAuthorize에 작성된 표현식의 조건을 충족하는지 확인하여 인가 권한을 결정하도록 함인가 담당자(Authorization Manager)는
MethodSecurityExpressionHandler를 사용하여@PreAuthorizeAnnotation에 작성된 SpEL 표현식을 파싱하고,Evaluation Context를 구성함
EvaluationContext에는 현재 인증된 객체(Supplier<Authentication>)와MethodInvocation을 포함하고 있음
인터셉터는 이
EvaluationContext를 활용하여 표현식을 평가하며,Supplier로부터Authentication객체를 읽고, 해당 객체 내에 존재하는 필드 중authorities필드에서permission:read권한을 가지고 있는지 확인함표현식에 대한 평가(Evaluation)가 통과하면, Spring AOP는 타겟 메서드인
readCustomer()의 호출을 수행함평가가 통과되지 않으면 인터셉터는
AuthorizationDeniedEvent객체를 발행하고,AccessDeniedException예외를 던지며,ExceptionTranslationFilter는 예외를 잡아서403 Status code를 응답함5번에 이어서 평가가 통과했고,
readCustomer()메서드가 작업을 수행 후 값을 반환한 이후, Spring AOP는@PostAuthorize를 동작시키기 위해AuthorizationManagerAfterMethodInterceptor를 동작시키며, 이후 과정은 앞선@PreAuthorize과정과 동일하게 수행됨5번과 동일
6번과 동일