1. 授权前提
- 所有的认证令牌对象
Authentication
保存了一组GrantedAuthority
对象,表示授予访问者(当事人principal
)的权限。
1.GrantedAuthority
对象是被AuthenticationManager
在认证访问者期间插入到Authentication
中的。这些GrantedAuthority
对象会被AccessDecisionManager
在对该访问者对于某个安全对象做出授权决定时使用;
2.GrantedAuthority
是一个接口,仅有一个方法定义String getAuthority()
,用于获取所受权限的字符串形式表示;
3.Spring Security
内置了一个GrantedAuthority
具体实现SimpleGrantedAuthority
,该实现支持在将权限字符串转成GrantedAuthority
类型对象;
4.Spring Security
内置的AuthenticationProvider
都使用SimpleGrantedAuthority
往Authentication
填充权限信息;
2. 授权过程 (Authorization
)
-
有授权控制的安全对象(
secure object
)的分类- 方法调用(
method invocation
) - web请求(
web request
)
- 方法调用(
-
授权动作调用者
- 拦截器
AbstractSecurityInterceptor
- 拦截器
-
授权控制阶段
-
调用前授权处理 (
pre-invocation handling
) :AccessDecisionManager
-
AccessDecisionManager
被AbstractSecurityInterceptor
调用,负责决定是否授权访问者继续访问目标安全对象; -
AccessDecisionManager
是一个接口,定义了三个方法void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;
该方法是投票过程, 有三个参数 :
Authentication authentication
代表访问者当事人,是访问者的认证令牌,包含了访问者的权限Object secureObject
表示目标安全对象,比如是一个方法调用MethodInvocation
Collection<ConfigAttribute> attrs
表示访问目标安全对象所需要的权限
boolean supports(ConfigAttribute attribute);
检测
ConfigAttribute attribute
是否是当前AccessDecisionManager
支持的ConfigAttribute
类型。boolean supports(Class clazz);
检测
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
- 通过
-
-
参考文章