1. 前言
欢迎阅读 Spring Security 实战干货 系列文章 。在上一篇 基于配置的接口角色访问控制 我们讲解了如何通过 javaConfig 的方式配置接口的角色访问控制。其实还有一种更加灵活的配置方式 基于注解 。今天我们就来探讨一下。DEMO 获取方式在文末。
2. Spring Security 方法安全
Spring Security 基于注解的安全认证是通过在相关的方法上进行安全注解标记来实现的。
2.1 开启全局方法安全
我们可以在任何
@Configuration
实例上使用
@EnableGlobalMethodSecurity
注解来启用全局方法安全注解功能。该注解提供了三种不同的机制来实现同一种功能,所以我们单独开一章进行探讨。
3. @EnableGlobalMethodSecurity 注解
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ GlobalMethodSecuritySelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableGlobalMethodSecurity {
/**
* 基于表达式进行方法访问控制
*/
boolean prePostEnabled() default false;
/**
* 基于 @Secured 注解
*/
boolean securedEnabled() default false;
/**
* 基于 JSR-250 注解
*/
boolean jsr250Enabled() default false;
boolean proxyTargetClass() default false;
int order() default Ordered.LOWEST_PRECEDENCE;
}复制代码
@EnableGlobalMethodSecurity
源码中提供了
prePostEnabled
、
securedEnabled
和
jsr250Enabled
三种方式。当你开启全局基于注解的方法安全功能时,也就是使用
@EnableGlobalMethodSecurity
注解时我们需要选择使用这三种的一种或者其中几种。我们接下来将分别介绍它们。
4. 使用 prePostEnabled
如果你在
@EnableGlobalMethodSecurity
设置
prePostEnabled
为
true
,则开启了基于表达式的方法安全控制。通过表达式运算结果的布尔值来决定是否可以访问(
true
开放,
false
拒绝 )。有时您可能需要执行开启
prePostEnabled
复杂的操作。对于这些实例,您可以扩展
GlobalMethodSecurityConfiguration
,确保子类上存在
@EnableGlobalMethodSecurity(prePostEnabled = true)
。例如,如果要提供自定义
MethodSecurityExpressionHandler
:
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
// ... create and return custom MethodSecurityExpressionHandler ...
return expressionHandler;
}
}复制代码