Shiro源码-创建subject
用了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相关推荐
- shiro源码篇 - 疑问解答与系列总结,你值得拥有
前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...
- Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包
Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包 问题:我想要从源码创建安装的软件包.有没有一种方式从源码来创建和安装软件包,而不是运行"make insta ...
- 从shiro源码角度学习工厂方法设计模式
绪论 shiro是一个简单易用,功能强大的Java安全框架,学习其源码设计思想对我们的编码水平的提高大有裨益.现在,就从源码角度带大家学习一下shiro里面的工厂方法模式. 这里的前提是读者有过使用s ...
- shiro源码解析-doFilter
shiro应该算的上java中最流行的权限框架了,使用的多了,便想着研究一下源码,看它究竟怎么运行的. doFilter是shiro对于每个请求都会走的一个效验过程.它的流程如下 从Delegatin ...
- dubbo学习之源码创建属于自己的dubbo-demo
目录 绪论 环境搭建 dubbo-demo-interface dubbo-demo-xml dubbo-demo-xml-provider dubbo-demo-xml-consumer 运行 绪论 ...
- 视频直播软件开发关于亚马逊s3接入方式,视频直播源码创建存储桶方法
一.登录亚马逊账户,进入S3 建立新的存储桶,用于视频直播源码的文件存储. 注册 Amazon S3 后,您就可以开始使用 AWS 管理控制台 创建存储桶.Amazon S3 中的每个对象都存储在存储 ...
- ThreeJS从实战到源码 - 创建场景
本文会从实战到源码进行一些简单例子的讲解,让你理论实战通通掌握. 搭建场景 先写一个载体文件,用于承载整个资源的html. 我们需要以下对象:scene, camera和renderer,这样我们就可 ...
- Shiro源码分析之Subject和SecurityManager
Subject 毫无疑问,Subject是Shiro最重要的一个概念. "Subject"只是一个安全术语,意味着应用程序用户的特定于安全性的"视图".Shir ...
最新文章
- 生态伙伴 | xiaopiu入驻飞书,助你高效创作,从原型到文档一站搞定!
- String是一个很普通的类 - Java那些事儿
- 第一章 面向对象编程
- SpringBoot中自定义消息转化器
- mac mysql mysqldump_Mac下Mysql导出sql语句的方法及可能遇到的mysqldump: command not found...
- IPropertySet接口
- 游戏开发-从零开始 002
- urllib库parse模块的使用
- DotNetNuke 5 C#版本解读之2--HTTP Modules
- hdu2115: I Love This Game
- 我的移动混合开发之旅
- spring boot+mybatis 系列
- Silverlight 的文本框自动完成(AutoComplete)
- Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)
- diy无感无刷电机霍尔安装_永磁无刷直流电机霍尔位置传感器的安装
- 招投标概念及注意事项
- DateTrack功能介绍-如何删除终止日期?
- 去了字节跳动,才知道年薪 40w 的 90 后 Android 开发者有这么多?
- 欧框语言框架标准C2,雅思成绩与欧洲语言共同参考框架的对应关系
- 安卓系统安全学习小结(二)