Spring 授权 (Authorization) 流程要点

1. 授权前提

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

2. 授权过程 (Authorization)

  • 有授权控制的安全对象(secure object)的分类

    • 方法调用(method invocation)
    • web请求(web request)
  • 授权动作调用者

    • 拦截器 AbstractSecurityInterceptor
  • 授权控制阶段

    • 调用前授权处理 (pre-invocation handling) : AccessDecisionManager

      • AccessDecisionManagerAbstractSecurityInterceptor调用,负责决定是否授权访问者继续访问目标安全对象;

      • AccessDecisionManager是一个接口,定义了三个方法

        void decide(Authentication authentication, Object secureObject,
                Collection<ConfigAttribute> attrs) throws AccessDeniedException;
        

        该方法是投票过程, 有三个参数 :

        • Authentication authentication代表访问者当事人,是访问者的认证令牌,包含了访问者的权限
        • Object secureObject表示目标安全对象,比如是一个方法调用MethodInvocation
        • Collection attrs 表示访问目标安全对象所需要的权限
        boolean supports(ConfigAttribute attribute);
        

        检测ConfigAttribute attribute是否是当前AccessDecisionManager支持的ConfigAttribute类型。

        boolean supports(Class clazz);
        

        检测Class clazz是否是当前AccessDecisionManager支持的secureObject

      • 开发者可以提供自己的AccessDecisionManager实现

      • Spring Security内置的AccessDecisionManager实现是基于投票机制的(voting)

        • AbstractAccessDecisionManagerSpring 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

  • 参考文章

    • Spring Security 官方参考手册: Authorization

你可能感兴趣的:(Spring,Security,分析)