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

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

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

Spring整合Shiro从源代码探究机制的更多相关文章

  1. Spring整合Shiro并扩展使用EL表达式

    Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...

  2. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

  3. Spring 整合 Shiro

    一.引入依赖 <!-- spring start --> <dependency> <groupId>org.springframework</groupId ...

  4. Spring整合Shiro 权限 角色 用户关系分析

    Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...

  5. spring整合shiro框架

    上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制 1.搭建环境 这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架, ...

  6. Spring整合Shiro

    apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存 ...

  7. 【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面

    这几天粗浅的把shiro整合到spring中,并且注解控制shiro用户/角色/权限And/OR 步骤: 1.首先maven搭建web项目 2.创建数据库 user/role/authority 其中 ...

  8. 【原】Spring整合Shiro基础搭建[3]

    1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Sprin ...

  9. spring整合shiro配置BUG,Tomcat启动不了:Error during artifact deployment. See server log for details

    现象 spring配置shiro权限控制之后,项目无法启动 [2019-08-09 09:00:35,800] Artifact export_web_manager:war exploded: Er ...

随机推荐

  1. 0x37 容斥原理与莫比乌斯函数

    多重集的组合数公式得记下.cf451E就是这个的裸题 #include<cstdio> #include<iostream> #include<cstring> # ...

  2. IPK僵尸网络 看看其传播手法

    转自:http://www.freebuf.com/vuls/154975.html 一.IPK僵尸网络概述 IPK僵尸家族是自2012年底就开始出现并长期持续活跃在境外的DDoS僵尸网络.2016年 ...

  3. netty结构

    一.先纵览一下Netty,看看Netty都有哪些组件? 为了更好的理解和进一步深入Netty,我们先总体认识一下Netty用到的组件及它们在整个Netty架构中是怎么协调工作的.Netty应用中必不可 ...

  4. HTML、CSS和JS中注释类型的总结

    添加必要的注释,是一个优秀的程序员必须具备的好习惯,可以大大提高代码的可维护性.可读性. 1.HTML注释 <!--注释的内容--> 注释的地方(根据个人习惯可能有所不同): 结束标签的后 ...

  5. 多元一次方程解法 C++

    #include<iostream> #include<math.h> #include<fstream> #include<stdlib.h> usi ...

  6. git + grunt 环境配置

        1⃣️ssh key生成步骤 一.设置Git的user.name和user.email: $ git config --global user.name "xiongzuyan&qu ...

  7. TESTUSERB 仅能对TESTUSERA 用户下的某些表增删改查、有些表仅能对某些列update,查询TESTUSERB 用户权限,获取批量赋予语句。

    TESTUSERB 仅能对TESTUSERA 用户下的某些表增删改查.有些表仅能对某些列update,查询TESTUSERB 用户权限,获取批量赋予语句. select 'grant '|| PRIV ...

  8. hdu1698 Just a hook 线段树区间更新

    题解: 和hdu1166敌兵布阵不同的是 这道题需要区间更新(成段更新). 单点更新不用说了比较简单,区间更新的话,如果每次都更新到底的话,有点费时间. 这里就体现了线段树的另一个重要思想:延迟标记. ...

  9. 路飞学城Python-Day50

    05-运算符 常用运算符 算数运算符 赋值运算符 比较运算符 逻辑运算符         // 赋值运算符          var money = prompt('请输入金额');          ...

  10. 8、Situation-Dependent Combination of Long-Term and Session-Based Preferences in Group Recommendations: An Experimental Analysis ----组推荐中基于长期和会话偏好的情景依赖组合

    一.摘要: 背景:会话组推荐系统的一个主要挑战是如何适当地利用群组成员之间的交互引起用户偏好,这可能会偏离用户的长期偏好.长期偏好和群组诱导的偏好之间的相对重要性应该根据具体的群组设置而变化. 本文: ...