《Spring Security》第二十章 Authorization Architecture - 授权架构

第二十章 Authorization Architecture - 授权架构

一、Authorization

所有的 Authentication 都存储着一个 GrantedAuthority 对象列表,这些对象代表了 Principal 所具有的权利。

GrantedAuthority 由 AuthenticationManager 插入到 Authentication 对象中,然后由 AccessDecisionManager 在作出授权决策时读取。

GrantedAuthority 只有一个方法接口: getAuthority(),该方法允许 AccessDecisionManager 获得 GrantedAuthority,通过字符串的形式返回。

SimpleGrantedAuthority 实现了 GrantedAuthority,这将允许任何用户 将 String 转换为 GrantedAuthority,在 Spring Security 中,所有的 AuthenticationProvider 都是用 SimpleGrantedAuthority 来填充 Authentication 对象。

二、Pre-Invocation Handling - 预处理

Spring Security 提供了 拦截器,用于控制安全对象的访问,比如方法调用或 web 请求等。AccessDecisionMananger 决定了是否允许进行调用。

2.1 The AccessDecisionManager

AccessDecisionManager 由 AbstractSecurityInterceptor 调用,负责做出最终的访问控制决策。接口包含三个方法:

/**
 * 做出最终访问控制的决策
 */
public interface AccessDecisionManager {
    // decide 方法传递它所需要的所有信息,以便做出授权决策
    void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;

    // 该方法用来确定 AccessDecisionManager 是否可以处理传入的 ConfigAttribute
    boolean supports(ConfigAttribute attribute);

    boolean supports(Class clazz);
}

2.2 Voting-Based AccessDecisionManager Implementations - 基于投票的辅助决策管理器的实现

Spring Security 包含了几个基于投票的 AccessDecisionManager 实现。用户也可以实现自己的 AccessDecisionManager 来控制授权的所有方面。

Access-Decision-Voting

使用这种方法,会对一系列的 AccessDecisionVoter 进行轮询,然后 AccessDecisionManager 根据投票结果来决定是否抛出 AccessDeniedException。

AccessDecisionVoter 接口有以下三种方法:

public interface AccessDecisionVoter {
    // 返回结果: ACCESS_GRANTED = 1 允许访问; ACCESS_DENIED = -1 拒绝访问; ACCESS_ABSTAIN = 0 弃权;
    int vote(Authenticaiton authentication, Object object, Collection<ConfigAttribute> attrs);

    boolean supports(ConfigAttribute attribute);

    boolean supports(Class clazz);
}

Spring Security 提供了三种具体的访问决策管理器来记录选票。

  1. UnanimousBased
    1. 无论投了多少 ACCESS_GRANTED 通过票,只要有 ACCESS_DENIED 反对票,则判断为不通过
    2. 如果没有 ACCESS_DENIED 反对票,且有 ACCESS_GRANTED 通过票,则判断为通过
  2. AffirmativeBased
    1. 只要有 ACCESS_GRANTED 通过票,则判断为通过
    2. 如果没有 ACCESS_GRANTED 通过票,且 ACCESS_DENIED 反对票在两个及以上,则判断为不通过
  3. ConsensusBased
    1. 如果 ACCESS_GRANED 通过票数大于 ACCESS_DENIED 反对票数,则判断为通过
    2. 如果 ACCESS_GRANED 通过票数小于 ACCESS_DENIED 反对票数,则判断为不通过
    3. 如果 ACCESS_GRANED 通过票数等于 ACCESS_DENIED 反对票数,则根据配置的 allowIfEqualGrantedDeniedDecisions(默认为true)来进行判断
  4. RoleVoter
    1. 将配置属性当做简单的角色名称,如果用户存在该角色,则通过授权
  5. AuthenticatedVoter
    1. 用来区分匿名、完全验证和 remember-me 用户

三、After Invocation Handling - 处理后

After Invocation Handling

文章作者: koral
文章链接: http://luokaiii.github.io/2019/07/24/读书笔记/《SpringSecurity》/20.AuthorizationArchitecture/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自