1. @PreAuthorize/@PostAuthorize 方法级安全(Method Security)的 SpEL 表达式与 AOP 实现
请说明 @PreAuthorize/@PostAuthorize 方法级安全(Method Security)的 SpEL 表达式与 AOP 实现机制?
- @PreAuthorize 方法执行前校验、@PostAuthorize 方法执行后校验
- SpEL 表达式(hasRole、hasAuthority、#参数)
- 基于 AOP 的 MethodSecurityInterceptor
@PreAuthorize 在方法执行前校验权限,@PostAuthorize 在方法执行后校验(可访问返回值,如 returnObject)。二者通过 SpEL 表达式表达授权规则,如 hasRole('ADMIN')、hasAuthority('READ')、#userId == authentication.principal.id、@bean.method() 等。实现基于 AOP:@EnableMethodSecurity 开启方法级安全,MethodSecurityInterceptor 作为 AOP 环绕通知拦截方法,通过 AuthorizationManager 评估 SpEL 表达式,不满足则抛出 AccessDeniedException。@PreAuthorize 用于"进入前授权",@PostAuthorize 用于"返回后授权(基于返回值)"。
方法级安全把"授权规则"以 SpEL 声明在方法上,由 AOP 拦截执行。相比 URL 级安全,方法级精确到方法,@PostAuthorize 可基于返回值决策。
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) {}
@PostAuthorize("returnObject.ownerId == authentication.principal.id")
public Order getOrder(Long id) { return order; }