上一篇写了shiro的启动加载过程的源码分析,现在来看看相对简单点的认证的流程源码,先来看看官方的流程图再对照我们日常的逻辑代码。比较一下

简单的解释下上图的步鄹:1.生成subject并且调用login(token)方法;2.调用securityManager的login()方法;3和4.进入到doGetAuthenticationInfo()方法进行真正的认证逻辑;5.在realm中查询数据源和传入的token比较,有匹配的就是认证成功。

再看看自定义的realm;是继承AuthorizingRealm的这点很重要
总结一下上面的,其实说到底shiro认证的流程就是上面两个截图完成的,下面我们来分析一下源码,看看是怎么个过程
首先:
点进去是DelegatingSubject实现了Subject

接着往里面找,找到了DefaultSecurityManager类的login()

接着进入了

继续跟着源码走,我们来到了![]()
很多情况当我们看到Abstract开头的类的时候就离真正的目标不远了(因为abstract有部分实现和接口方法,承上启下的作用,上面的几张截图在这里讲解一下:认证器的实现类,SecurityMananger也继承自Authenticator,通过查看AuthenticatingSecurityManager源码其实就是Authenticator的代理。而真正实现认证功能的Authenticator实现类只有一个ModularRealmAuthenticator,从类的名字可以看出这个认证器的实现原理——模块化认证器:一个Realm就是一个认证模块。
下面来看看单一的realm的doSingleRealmAuthentication()方法

进入到了Realm接口里面![]()
![]()
继续找他的实现进入到了AuthenticatingRealm类(这个类就是我们开头说的要注意的,他是我们自定义的my)


最后一次点进去![]()

为什么找到自定义realm里的实现了呢,看看继承关系就知道了


到这里就分析的差不多了,剩下的就是我们自定义MyShiroRealm里面的doGetAuthenticationInfo方法进行认证。
最后,你以为就这样就结束了???敲代码是不可能的,这辈子都不可能!
忘记了这张图么?

是的,借用武器大师一句话:我又回来啦。那么认证凭证生成了,下面我们要去认证了;
老办法点进去看assertCredentialsMatch()看看是怎么认证的,这是 void 方法,不会返回只会抛异常,所以应该在这里判断返回是 true 还是 false

点进去doCredentialsMatch(),我擦,发现是个接口有四个实现类(看名字就知道是加密算法的大佬,惹不起,惹不起),我们的认证方法doCredentialsMatcher()也有这四个实现方法,我们看一下最难(简单)的实现



今天的内容总结一下:
1.创建AuthenticationToken,然后调用subject.login(token)方法进行登录认证;
2.Subject委托给SecurityManager;
3.SecurityManager委托给Authenticator接口;
4.Authenticator接口调用 MyShiroRealm 获取登录信息,进行认证。
最后,说实话我感觉认证的源码比启动加载简单很多,跟着源码点进去就行了,自己也是个菜鸡,有什么不对的,请各位老铁多多指教,多多评论,谢谢啦!
本文对Shiro认证流程的源码进行分析。先介绍认证流程,包括生成subject调用login方法、securityManager处理、进入认证逻辑、在realm中匹配数据源等。接着深入源码,分析了相关类和方法,如DelegatingSubject、DefaultSecurityManager等,最后总结认证步骤,指出认证源码相对简单。

6427

被折叠的 条评论
为什么被折叠?



