spring security中的AbstractSecurityInterceptor
前言
简单复习一下看的 AbstractSecurityInterceptor的内容
一、AccessDecisionManager
AccessDecisionManager是实际处理请求的接口,spring security三种不同的实现,也可以自定义实现。如果拒绝会抛出AccessDeniedException异常,通过则正常返回
默认实现
默认的三种实现都是将请求委托给AccessDecisionVoter的集合去处理,区别在于根据针对AccessDecisionVoter处理结果的处理策略
AccessDecisionVoter 中的vote方法会返回一个int
值,通常是在AccessDecisionVoter所定义的值
int ACCESS_GRANTED = 1;
int ACCESS_ABSTAIN = 0;
int ACCESS_DENIED = -1;
三种实现:
- AffirmativeBased:这是AbstractSecurityInterceptor中的默认实现方式,它会将针对安全对象进行操作所需的所有权限分别委托给Voter处理,只要有一个Voter返回结果为ACCESS_GRANTED就会通过
- ConsensusBased: 同样将针对安全对象进行操作所需的所有权限分别委托给Voter处理,但会判断并比较返回ACCESS_GRANTED和ACCESS_DENIED的数量,ACCESS_GRANTED较多则通关,两者相同默认拒绝,但可以手动设置.
- UnanimousBased: 它会将所需的每一个权限分别委托给Voter去处理,当任意一个Voter针对任意一个权限返回ACCESS_DENIED都会拒绝访问
如果所有Voter都返回ACCESS_ABSTAIN ,默认会拒绝不过可以手动配置
接口中方法
void decide(Authentication authentication, Object object,
Collection<ConfigAttribute> configAttributes) throws AccessDeniedException,
InsufficientAuthenticationException;
参数:
authentication: 在认证过程中封装的对象,可以从中取出封装的user对象
object:保护的安全对象,实际类型根据AbstractSecurityInterceptor实现的不同而不同,通常为 FilterInvocation或MethodInvocation
configAttributes: 针对该安全对象操作所需的权限,通常是通过SecurityMetadataSource的实体类获取
异常:
抛出这两种异常分别用于表示认证不足和权限不足,意义它们在于分别是由ExceptionTranslationFilter中的AccessDeniedHandler和AuthenticationEntryPoint来处理,需要注意的是匿名用户和通过remeberme认证的用户即使是AccessDeniedException也是由AuthenticationEntryPoint来处理
boolean supports(ConfigAttribute attribute);
boolean supports(Class<?> clazz);
在AbstractAccessDecisionManager有默认实现,默认要求每一个ConfigAttribute都有Voter支持处理,所有Voter都要支持clazz(clazz就是安全对象的class)
二、FilterSecurityInterceptor
这是是srping security过滤器链中AbstractSecurityInterceptor的默认实现,所保护的安全对象的类型为FilterInvocation,同时这还是一个过滤器。
默认的AccessDecisionVoter集合
默认提供的AccessDecisionVoter的集合如下
List<AccessDecisionVoter<