Spring 授权 (Authorization) 流程要点

  1. 授权前提
    所有的认证令牌对象Authentication保存了一组GrantedAuthority对象,表示授予访问者(当事人principal)的权限。
  2. GrantedAuthority对象是被AuthenticationManager在认证访问者期间插入到Authentication中的。这些GrantedAuthority对象会被AccessDecisionManager在对该访问者对于某个安全对象做出授权决定时使用;
  3. GrantedAuthority是一个接口,仅有一个方法定义String getAuthority(),用于获取所受权限的字符串形式表示;
  4. Spring Security内置了一个GrantedAuthority具体实现SimpleGrantedAuthority,该实现支持在将权限字符串转成GrantedAuthority类型对象;
  5. Spring Security内置的AuthenticationProvider都使用SimpleGrantedAuthority往Authentication填充权限信息;
  6. 授权过程 (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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值