前言
之前在写【Shiro】SimpleAuthenticationInfo如何验证password的时候,了解了下验证方式的源码,但在做shiro整合Jwt时,debug发现执行的顺序和理解的不太一样,因此,中途插篇了解下这个login的源码,看看它是怎么执行进去的。
ps:主要目的是想和 验证的部分 衔接上,能力有限不敢一步登天😂。
1、源码查看
1.1 Subject接口
1.2 DelegatingSubject类
主要执行了securityManager的login方法。
1.3 SecurityManager接口
login的接口
1.4 DefaultSecurityManager类
该方法为login的实现类,最下面框住的就是最后的登录(感觉涉及到的方法比较多,但不算很难,有兴趣的大佬们可以再去细看)。我们这里主要关注如何走到验证,给登录提供info的。
1.5 AuthenticatingSecurityManager抽象类
1.6 Authenticator接口
顺着下来,找到authenticate接口,它的实现类,我们往有验证的看。
1.7 AbstractAuthenticator抽象类
ps:这个代码样式略显眼熟,感觉八九不离十了。
点击查看doAuthenticate方法
,再去看它的实现类
1.8 ModularRealmAuthenticator类
看过官方文档,或者一些shiro执行登录的博客,我们都知道流程会执行到这这个类。
在代码中,单个Realm和多个Realm是什么?因为后面想看小程序,简单了解到,项目中会放web端的Realm和小程序端的Realm,分别处理不同的登录。(后续在慢慢了解)
往下继续查看doSingleRealmAuthentication方法
,如下图,在该方法中值得留意的是realm.supports(token)
和realm.getAuthenticationInfo(token)
这两个方法,他们都是Realm接口下的方法。
1.9 Realm接口
supports方法
这就不用多说了,这个就是1.8中翻译说的,确保realm支持token的类型。
ps:在整合jwt中,自定义realm需要重写supports方法
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JwtToken;
}
我们主要来看下getAuthenticationInfo方法。
1.10 AuthenticatingRealm类
到这里就基本了解了整个登录得到的源码。