- 授权前提
所有的认证令牌对象Authentication保存了一组GrantedAuthority对象,表示授予访问者(当事人principal)的权限。 - GrantedAuthority对象是被AuthenticationManager在认证访问者期间插入到Authentication中的。这些GrantedAuthority对象会被AccessDecisionManager在对该访问者对于某个安全对象做出授权决定时使用;
- GrantedAuthority是一个接口,仅有一个方法定义String getAuthority(),用于获取所受权限的字符串形式表示;
- Spring Security内置了一个GrantedAuthority具体实现SimpleGrantedAuthority,该实现支持在将权限字符串转成GrantedAuthority类型对象;
- Spring Security内置的AuthenticationProvider都使用SimpleGrantedAuthority往Authentication填充权限信息;
- 授权过程 (Authorization)
有授权控制的安全对象(secure object)的分类
方法调用(method invocation)
web请求(web request)
授权动作调用者
拦截器 AbstractSecurityInterceptor
授权控制阶段
调用前授权处理 (pre-invocation handling) : AccessDecisionManager
AccessDecisionManager被AbstractSecurityInterceptor调用,负责决定是否授权访问者继续访问目标安全对象;
AccessDecisionManager是一个接口,定义了三个方法
void decide(Authentication authentication, Object secureObject,
Collection attrs) throws AccessDeniedException;
1
2
该方法是投票过程, 有三个参数 :
Authentication authentication代表访问者当事人,是访问者的认证令牌,包含了访问者的权限
Object secureObject表示目标安全对象,比如是一个方法调用MethodInvocation
Collection attrs 表示访问目标安全对象所需要的权限
boolean supports(ConfigAttribute attribute);
1
检测ConfigAttribute attribute是否是当前AccessDecisionManager支持的ConfigAttribute类型。
boolean supports(Class clazz);
1
检测Class clazz是否是当前AccessDecisionManager支持的secureObject。
开发者可以提供自己的AccessDecisionManager实现
Spring Security内置的AccessDecisionManager实现是基于投票机制的(voting)
AbstractAccessDecisionManager 是Spring Security内置的AccessDecisionManager实现的抽象基类
AbstractAccessDecisionManager使用一组AccessDecisionVoter投票者投票表决进行授权
AccessDecisionVoter是一个接口,建模投票者这一概念
每个AccessDecisionVoter对每次投票可以给出如下三个结论中的一个
否决 : ACCESS_DENIED
弃权 : ACCESS_ABSTAIN
赞同 : ACCESS_GRANTED
AbstractAccessDecisionManager有三个内置实现
AffirmativeBased – 一票通过即可放行
ConsensusBased – 多数投票通过可放行
UnanimousBased – 全票通过才放行
调用后授权处理 (after-incocation handling) : AfterInvocationManager
通过AfterInvocationManager可以对受保护的安全对象的返回对象做修改
Spring Security提供了AfterInvocationManager的一个内置实现AfterInvocationProviderManager
AfterInvocationProviderManager维护一组AfterInvocationProvider完成指定的任务
对受保护的安全对象的返回对象逐一应用这些AfterInvocationProvider