美文网首页Spring Security Oauth2.0认证授权
15.Spring Security应用详解-工作原理-授权流程

15.Spring Security应用详解-工作原理-授权流程

作者: LANSHENGYANG | 来源:发表于2020-03-25 15:58 被阅读0次

    授权流程

    授权流程

    • 通过快速上手我们知道,Spring Security可以通过http.authorizeRequests()对web请求进行授权保护。Spring Security使用标准Filter建立了对web请求的拦截,最终实现对资源的授权访问。
    • Spring Security的授权流程如下:


      image
    分析授权流程:
    • 1.拦截请求,已认证用户访问保护的web资源将被SecurityFilterChain中的FilterSecurityInterceptor的子类拦截。
    • 2.获取资源访问策略,FilterSecurityInterceptor会从SecurityMetadataSource的子类DefaultFilterInvocationSecurityMetadataSource获取要访问当前资源所需要的权限Collection<ConfigAttribute>
    • SecurityMetadataSource其实就是读取访问策略的抽象,而读取的内容,其实就是我们配置的访问规则,读取访问策略如:
    http
        .authorizeRequests()
            .antMatchers("/r/r1").hasAuthority("p1")
            .antMatchers("/r/r2").hasAuthority("p2")
            ...
    
    • 3.最后。FilterSecurityInterceptor会调用AccessDecisionManager进行授权决策,若决策通过,则允许访问资源,否则将禁止访问。
    • AccessDecisionManager(访问资源管理器)的核心接口如下:
    public class AccessDecisionManager {
        /**
         * 通过传递的参数来决定用户是否访问对应受保护资源的权限
         * @param authentication
         * @param object
         * @param configAttributes
         */
        void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes){、
            //略..
        }
    }
    
    • 这里着重说明一下decide的参数:
    • authentication:要访问资源的访问者的身份
    • object:要访问的受保护资源,web请求对应FilterInvocation
    • configAttributes:受保护资源的访问策略,通过SecurityMetadataSource获取
    • decide接口就是用来鉴定当前用户是否访问对应受保护资源的权限。

    授权决策

    • AccessDecisionManager采用投票的方式来确定是否能够访问受保护资源。

    • 通过上图可以看出,AccessDecisionManager中包含的一系列AccessDecisionVoter将会被用来对Authentication是否有权限访问受保护对象进行投票,AccessDecisionManager根据投票结果,做出最终决策。

    • AccessDecisionVoter是一个接口,其中定义有三个方法,具体结构如下所示。

    public interface AccessDecisionVoter<S> {
        int ACCESS_GRANTED = 1;
        int ACCESS_ABSTAIN = 0;
        int ACCESS_DENIED = -1;
    
        boolean supports(ConfigAttribute attribute);
        
        boolean supports(Class<?> clazz);
    
        int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes);
    }
    
    • vote()方法的返回结果会是AccessDecisionVoter中定义的三个常量之一。ACCESS_GRANTED表示同意,ACCESS_DENIED表示拒绝,ACCESS_ABSTAIN表达弃权。如果一个AccessDecisionVoter不能判定当前Authentication是否拥有访问对应受保护对象的权限,则其vote()方法的返回值当弃权ACCESS_ABSTAIN。

    • Spring Security内置了三个基于投票的AccessDecisionManager实现类如下,它们分别是AffirmativeBased,ConsensusBased和UnanimousBased。

      • AffirmativeBased的逻辑是:
        (1)如果赞成票多反对票则表示通过。
        (2)反过来,如果反对票多赞成票则将抛出AccessDeniedException。
        (3)如果赞成票与反对票相同且不等于0,并且属性allowlfEqualGrantedDeniedDecisions的值为true,则表示通过,否则将抛出异常AccessDeniedException。参数allowlfEqualGranedDeniedDecision的值默认为true。
        (4)如果所有的AccessDecisionVoter都弃权了,则将视参数allowlfAllAbstainDecisions的值而定,如果该值为true则表示通过,否则将抛出异常AccessDeniedException。参数allowlfAllAbstainDecisions的值默认为false。

    相关文章

      网友评论

        本文标题:15.Spring Security应用详解-工作原理-授权流程

        本文链接:https://www.haomeiwen.com/subject/wkxzyhtx.html