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中了


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

posted on 2017-06-12 20:12  slgkaifa  阅读(327)  评论(0编辑  收藏  举报

导航