天天看点

shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程

再看看自定义的realm;是继承AuthorizingRealm的这点很重要

shiro安全框架源码分析--登陆认证流程

总结一下上面的,其实说到底shiro认证的流程就是上面两个截图完成的,下面我们来分析一下源码,看看是怎么个过程

首先:

shiro安全框架源码分析--登陆认证流程

点进去是DelegatingSubject实现了Subject

shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程

接着进入了

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

继续跟着源码走,我们来到了

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

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

下面来看看单一的realm的doSingleRealmAuthentication()方法

shiro安全框架源码分析--登陆认证流程

进入到了Realm接口里面

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

最后一次点进去

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

 到这里就分析的差不多了,剩下的就是我们自定义MyShiroRealm里面的doGetAuthenticationInfo方法进行认证。

最后,你以为就这样就结束了???敲代码是不可能的,这辈子都不可能!

忘记了这张图么?

shiro安全框架源码分析--登陆认证流程

是的,借用武器大师一句话:我又回来啦。那么认证凭证生成了,下面我们要去认证了;

老办法点进去看assertCredentialsMatch()看看是怎么认证的,这是 void 方法,不会返回只会抛异常,所以应该在这里判断返回是 true 还是 false

shiro安全框架源码分析--登陆认证流程

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

shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程
shiro安全框架源码分析--登陆认证流程

今天的内容总结一下:

1.创建AuthenticationToken,然后调用subject.login(token)方法进行登录认证;

2.Subject委托给SecurityManager;

3.SecurityManager委托给Authenticator接口;

4.

Authenticator接口调用 MyShiroRealm 获取登录信息,进行认证。

最后,说实话我感觉认证的源码比启动加载简单很多,跟着源码点进去就行了,自己也是个菜鸡,有什么不对的,请各位老铁多多指教,多多评论,谢谢啦!

继续阅读