zoukankan      html  css  js  c++  java
  • Spring整合Shiro从源代码探究机制

    首先从例如以下配置開始说起



    ShiroDbFilterFactoryBean继承了ShiroFilterFactoryBean这个由jar提供的bean类,

    而且它实现了InitializingBean接口


    方法例如以下


    有个基本常识,实例化ShiroDbFilterFactoryBean必先实例化ShiroFilterFactoryBean


    那我们应当看看ShiroFilterFactoryBean如今正式開始一步步探个到底。里面都做什么事情了



    一、ShiroFilterFactoryBean

    1、getObject()方法


    此类实现了FactoryBean接口。则Object getObject():返回有FactoryBean创建的Bean实例,假设isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。


    2、createInstance()方法



    3、createFilterChainManager()方法


    这种方法将返回shiro须要的一个重要对象:DefaultFilterChainManager



    3.1、加入所需过滤器





    3.2、加入须要过滤的url连接



    3.2.1、splitChainDefinition方法

    它的目的是切割

    filterTokens[0]=cAuthc

    filterTokens[1]=cRoles[999]


    3.2.2、toNameConfigPair方法

    它的目的是切割。如cRoles[999] 为

    nameConfigPair[0]=cRoles

    nameConfigPair[1]=999


    3.2.3、addToChain方法



    3.2.3.1、applyChainConfig方法

    找到相应的filter



    三、shiro眼下都提供了这些过滤器

    仅仅要你的訪问路劲约定了以下随意一个过滤器,都会由其推断你的权限



    AnonymousFilter过滤器

    在你訪问的地址属于应该AnonymousFilter过滤的时候会发生什么呢。比方/login.html



    看到了吧,直接放行


    四、PathMatchingFilter

    看了上面两个样例了。该注意关键,它们都终于继承了PathMatchingFilter,注意咯,既然都是继承了它。那肯定是PathMatchingFilter对url过滤拦截的时候在拦截方法中会调用

    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) 

    一起 看看isFilterChainContinued(request, response, path, config)


    onPreHandle(request, response, pathConfig)

    真正实现这种方法的是在 


    这里我们以最重要的 AccessControlFilter 为例

    public abstract class AccessControlFilterextendsPathMatchingFilter 


    • isAccessAllowed:即是否同意訪问,返回true表示同意。
    • onAccessDenied:表示訪问拒绝时是否自己处理,假设返回true表示自己不处理且继续拦截器链运行,返回false表示自己已经处理了(比方重定向到还有一个页面)。

    也就是说当isAccessAllowed不同意訪问时(false)。由onAccessDenied 处理,比方FormAuthenticationFilter过滤器,它首先推断是不是登陆url。假设是登陆url,又区分是

    get提交的话。就放过去,是post提交就登陆。假设不是登陆url,就保存当前訪问的url,而且跳到登陆页。

    isAccessAllowed(request, response, mappedValue)的实如今 public abstract classAuthenticatingFilter extendsAuthenticationFilter


    super.isAccessAllowed(request, response, mappedValue)在它的父类public abstract classAuthenticationFilter extendsAccessControlFilter



    它的作用是推断用户是否authentication(认证; 身份验证)成功过。    ps:authorization(授权,批准

    那么回到public abstract class AccessControlFilter extends PathMatchingFilter 

    它的onAccessDenied(request, response, mappedValue)由谁实现呢

    事实上是详细的过滤器。如:public class FormAuthenticationFilterextendsAuthenticatingFilter



    最后说说 appliedPaths 会拿到属于某个过滤器全部它该过滤的链接,那你要问怎么拿到的,别急,跟着一起去看看吧


    继续


    我们又回到了一開始看到的DefaultFilterChainManager



    惊奇吧


    就在系统启动初始化的时候,配置中的相关信息就已经都放入各个filter中了


    记住一句话源代码面前了无秘密。

  • 相关阅读:
    logback配置模板
    mail
    jpa,querydsl
    加密签名
    angular2快速开始
    主从复制
    随笔
    缺货源的小伙伴们 我发现一个超级好的货源供应链 分享给大家
    canal+kafka+logstash+es 架构 logstash的配置
    golang 根据图片url获取图片尺寸
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6994784.html
Copyright © 2011-2022 走看看