一、前言
通篇的关键就是知道ShiroRealm类重写的doGetAuthenticationInfo这个方法,到底是谁的方法。
从上图我们可以知道,ShiroRealm最终继承到了AuthenticatingRealm这个方法。
二、自定义的ShiroRealm类
ps:该图中①上的注释是没看过底层的时候,先入为主的理解。
在自定义的ShiroRealm中,看上去像验证的就是①,但也只是创建了一个SimpleAuthenticationInfo对象
,最后②return出去就没了。
小白的我尝试Debug去找实际执行的代码,却只跳到了SimpleAuthenticationInfo类中,最后一无所获。
我们回过头看下ShiroRealm,它继承了AuthorizingRealm
进到了AuthorizingRealm里面,你会发现还是什么没有,但你会注意到,它继承了AuthenticatingRealm(他们的关系如 一前言 所示)。
三、AuthenticatingRealm类
在该类中,通过Find可以发现,AuthenticatingRealm类中含有抽象方法doGetAuthenticationInfo
,也就意味着,ShiroRealm中@Override就是它。
我们在看下是谁调用了这个方法,最后可以发现,在AuthenticatingRealm类中,getAuthenticationInfo()
方法里的②调用了该方法;也就是说,我们在ShiroRealm中return的内容在这里。
讲到这里,我们分别在看下①和③。
1、getCachedAuthenticationInfo(token)
①从字面意思,参数和最后对象的类名,可以知道,这就是获取token中的用户名和密码。
AuthenticationInfo类(如下图)和AuthenticationToken有点类似,可以扩展看下shiro AuthenticationToken体系。
getCachedAuthenticationInfo主要是看缓存和token,获取用户信息。
2、assertCredentialsMatch(token, info)
在该方法里面有CredentialsMatcher()
,虽然我不知道是什么,但下面的if里面调用了该对象的方法cm.doCredentialsMatch(token, info)
。
从接口上可以看到有4个实现类,废话不多说,一个个看了后发现第一个只返回true,第二个处理有salt的,第四个处理没salt的,第三个太长了没细看。
对比下来,salt应该就是我们要找的。
ps:解密我看不懂,暂时就不再深究了,有兴趣的大佬们可以去看看。
可以看到这里,我们就知道doCredentialsMatch
方法中,最后token解密的数据和数据库中的数据相同,就会返回true,也就意味着验证通过。