1.4.2 方法安全
Spring Security在方法级别进行权限控制,这样可以让权限控制更灵活。使用注解@EnableGlobalMethodSecurity
开启方法安全注解的支持(组合了@Configuration
注解):
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//...
}
使用了prePostEnabled = true
后可支持下面注解来进行方法安全控制,其它类型的注解本书不做讨论。
@PreAuthorize
:通过访问控制表达式控制在方法调用前决定方法是否允许被调用;@PreFilter
:定义规则过滤注解方法的参数(集合),filterObject
代表集合或数据里的当前对象;@PostAuthorize
:当方法被调用后,访问控制表达式将被检查,若检查返回值表达式可使用returnObject
;@PostFilter
:定义规则过滤方法返回值(集合或数组),filterObject
代表集合或数据里的当前对象。
同样我们也要学习下方法安全的原理,web路径安全是从FilterSecurityInterceptor
开始的 ,而方法安装时通过MethodSecurityInterceptor
开始的,他们都是AbstractSecurityInterceptor
的子类。
MethodSecurityInterceptor
:对方法安全进行授权操作;它由@EnableGlobalMethodSecurity
导入的配置GlobalMethodSecurityConfiguration
初始化。MethodSecurityInterceptor
还实现了AOP的MethodInterceptor
接口来拦截注解方法;拦截方法调用AccessDecisionManager
对注解方法进行授权操作。MethodSecurityInterceptor
:提取使用注解(如@PreAuthorize
)的方法元数据并存储和提供查询功能,它是由PrePostAnnotationSecurityMetadataSource
实现类提供功能的。
AccessDecisionManager
:decide
方法中被保护的资源对象类型为MethodInvocation
;AffirmativeBased
:由一组AccessDecisionVoter
进行投票来授权;AccessDecisionVoter
:方法安全控制的主要实现有:PreInvocationAuthorizationAdviceVoter
,它使用ExpressionBasedPreInvocationAdvice
对表达式进行计算,从而达到对方法的访问控制。
我们的演示控制器内容如下: