用了shiro很长时间了,但是一直也没有深入了解,最近再一次使用到的时候,决定深入了解一下它的源码。主要是网上的资料太乱了,每次查的东西都是乱七八糟的,还是要自己去了解,去解决问题。申明一下,这篇博文主要是为了自己作记录,不是为了让谁看懂,所以会比较乱。另外,我使用的场景是web,所以我了解到的是webSubject。

shiro本质上就是过滤器,所以要理解他的请求过程,按照过滤器的请求过程就行了。

1、请求到web服务器之后,会先到OncePerRequestFilter中的doFilter中,并且由于这个方法是final的,你甚至都不用担心这个方法被重写,就是这里了。然后我们可以看到最关键的就是doFilterInternal方法了。

2、doFilterInternal方法在OncePerRequestFilter类里只是一个抽象方法,所以我们去它的子类里找实现。

可以看到,这里有两个实现,AbstractShiroFilter这个过滤器的作用是创建subject,创建请求所对应的过滤链,创建好的过滤器是AdviceFilter类型的,所以AbstractShiroFilter创建subject之后,创建好过滤链,再次经过doFilter方法,走AdviceFilter过滤器,这个时候才是真正的shiro部分的filter。好了,我们先看看AbstractShiroFilter这个类里面doFilterInternal的实现,两部分:创建subject和创建过滤链。

3、创建subject,subject对于shiro来说,某方面就相当于session对于web服务器一样(个人理解),每次请求过来,shiro都会创建一个subject,我们所有关于shiro的操作都是通过subject来完成的。然后我们来看一下createSubject方法。

简短的一行代码,但是这一行代码让人很难受,接着我们跟进去。

这是WebSubject类的静态内部类Builder的构造方法,然后我们在看一下Builder的父类构造方法

这里的securityManager就是我们配置的securityManager对象,然后创建了一个subjectContext对象,然后把securityManager对象塞进去,看它的名字就知道,它是一个全局的东西,事实上就是一个键值对,后面会从里面取值,上面的setRequest和setResponse也是把request和response对象塞进去。

然后我们回到createSubject方法中的buildWebSubject方法来,跟进去可以看到最后到了DefaultSecurityManager中的createSubject方法里,当然,你也可以重写这个方法。这里主要介绍三个方法。

a、resolveSession方法,分解session,看一下它的具体实现,可以看到就是分解context中的session然后塞到context,context前面介绍了,是全局的,这里塞session进去,肯定就是后面要从这里面取了。然后我们再来看一个resolveContextSession方法,可以看到这个方法就是从context中获取sessionKey,然后用sessionKey获取session,看一个具体的getSession吧。

这里的sessionManager也是我们配置的对象,然后它有三个地方都实现也这个方法,因为我配置的sessionManager继承于AbstractNativeSessionManager,所以我们就去第一个类里面去看。

可以看到,就是一些getSession的操作,但是每个方法都分的很细,这种编程风格值得学习。最后的doGetSession是一个抽象方法,我们到具体的实现里去看看吧。

到了它的子类AbstractValidatingSessionManager中,又是一个抽象方法,再到具体实现中去。

终于看到具体实现了,这里会根据你的配置去获取session,具体要看你的sessionDao是怎么配置的了

这个方法在AbstractSessionDao中,具体还是要看你有没有重写吧。到这里,就看到了获取session的完整过程了。

b、回到上面,因为resolvePrincipals方法里面最主要的部分还是获取session,所以就不说了,来看看doCreateSubject方法吧。这个方法就是真正创建subject的方法。这里用到了工厂模式,所以是从subjectFactory中获取的subject。然后我们看DefaultWebSubjectFactory里面,可以看到就是从context中取值,然后构造了一个WebDelegatingSubject对象,这个时候我们就创建了一个subject对象了,一切才刚刚开始。

c、最后来看看save(subject)吧,这个方法是保存subject?其实不是,它主要是为了保存subject中的session。我们来跟代码,最终会到saveToSession方法里面去,这个方法里面主要有两个方法mergePrincipals和mergeAuthenticationState,一个是关于登录人员信息的,另一个是关于登录状态的。都是将subject中的相关信息存到session中去。

到这里,我们的subject就算是创建完成了。

Shiro源码-创建subject相关推荐

  1. shiro源码篇 - 疑问解答与系列总结,你值得拥有

    前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...

  2. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  3. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  4. Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包

    Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包 问题:我想要从源码创建安装的软件包.有没有一种方式从源码来创建和安装软件包,而不是运行"make insta ...

  5. 从shiro源码角度学习工厂方法设计模式

    绪论 shiro是一个简单易用,功能强大的Java安全框架,学习其源码设计思想对我们的编码水平的提高大有裨益.现在,就从源码角度带大家学习一下shiro里面的工厂方法模式. 这里的前提是读者有过使用s ...

  6. shiro源码解析-doFilter

    shiro应该算的上java中最流行的权限框架了,使用的多了,便想着研究一下源码,看它究竟怎么运行的. doFilter是shiro对于每个请求都会走的一个效验过程.它的流程如下 从Delegatin ...

  7. dubbo学习之源码创建属于自己的dubbo-demo

    目录 绪论 环境搭建 dubbo-demo-interface dubbo-demo-xml dubbo-demo-xml-provider dubbo-demo-xml-consumer 运行 绪论 ...

  8. 视频直播软件开发关于亚马逊s3接入方式,视频直播源码创建存储桶方法

    一.登录亚马逊账户,进入S3 建立新的存储桶,用于视频直播源码的文件存储. 注册 Amazon S3 后,您就可以开始使用 AWS 管理控制台 创建存储桶.Amazon S3 中的每个对象都存储在存储 ...

  9. ThreeJS从实战到源码 - 创建场景

    本文会从实战到源码进行一些简单例子的讲解,让你理论实战通通掌握. 搭建场景 先写一个载体文件,用于承载整个资源的html. 我们需要以下对象:scene, camera和renderer,这样我们就可 ...

  10. Shiro源码分析之Subject和SecurityManager

    Subject 毫无疑问,Subject是Shiro最重要的一个概念. "Subject"只是一个安全术语,意味着应用程序用户的特定于安全性的"视图".Shir ...

最新文章

  1. 生态伙伴 | xiaopiu入驻飞书,助你高效创作,从原型到文档一站搞定!
  2. String是一个很普通的类 - Java那些事儿
  3. 第一章 面向对象编程
  4. SpringBoot中自定义消息转化器
  5. mac mysql mysqldump_Mac下Mysql导出sql语句的方法及可能遇到的mysqldump: command not found...
  6. IPropertySet接口
  7. 游戏开发-从零开始 002
  8. urllib库parse模块的使用
  9. DotNetNuke 5 C#版本解读之2--HTTP Modules
  10. hdu2115: I Love This Game
  11. 我的移动混合开发之旅
  12. spring boot+mybatis 系列
  13. Silverlight 的文本框自动完成(AutoComplete)
  14. Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)
  15. diy无感无刷电机霍尔安装_永磁无刷直流电机霍尔位置传感器的安装
  16. 招投标概念及注意事项
  17. DateTrack功能介绍-如何删除终止日期?
  18. 去了字节跳动,才知道年薪 40w 的 90 后 Android 开发者有这么多?
  19. 欧框语言框架标准C2,雅思成绩与欧洲语言共同参考框架的对应关系
  20. 安卓系统安全学习小结(二)

热门文章

  1. Vue3 学习笔记 —— transition、transition-group
  2. nginx+php-fpm docker镜像合二为一
  3. JavaScript数组forEach方法
  4. 删除右键新建多余菜单
  5. 汽车维修企业管理【8】
  6. 小程序behavior
  7. 交通运输学计算机吗,交通运输专业所属学科门类是什么
  8. No Sequelize instance passed
  9. 化繁为简,远光天擎助你一键云部署
  10. 计算机专业调剂化学专业,汕头大学计算机化学专业2015年考研调剂信息