上一篇写了shiro的启动加载过程的源码分析,现在来看看相对简单点的认证的流程源码,先来看看官方的流程图再对照我们日常的逻辑代码。比较一下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR1UNJRUT5tGVNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4AjN3EjMzIjM5AzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
简单的解释下上图的步鄹: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 获取登录信息,进行认证。
最后,说实话我感觉认证的源码比启动加载简单很多,跟着源码点进去就行了,自己也是个菜鸡,有什么不对的,请各位老铁多多指教,多多评论,谢谢啦!