Shiro系列六:认证源码解析

本文详细解析了Shiro认证流程,包括SecurityManager对象生成、环境初始化、认证组件调用及自定义Realm实现。通过理解Subject、SecurityManager、authenticator与Realm间的交互,深入探讨了Shiro如何验证用户登录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、SecurityManager对象的生成。SecurityManager对象是在监听器里面生成的。在这里插入图片描述
2、根据我们的shiroEnvironmentClass变量的值org.apache.shiro.web.env.IniWebEnvironment,初始化一个shiro环境对象。
在这里插入图片描述
3、创建一个SecurityManager对象,并将其绑定到刚才通过字节码创建的Shiro环境对象中。
在这里插入图片描述
4、查看subject.login(token) 的源码。进入Subject接口的默认实现类,然后Subject将用户的用户名密码(token)委托给了securityManager去认证。
在这里插入图片描述
5、securityManager将用户的token委托给内部认证组件authenticator去认证。
在这里插入图片描述
6、用户的token需要去跟数据源Realm做对比,所以authenticator又将认证的任务交给Realm去做。在这里插入图片描述
7、Realm在接到认证任务后,将调用Realm的实现类AuthenticatingRealm的doGetAuthenticationInfo(token)方法。而这个方法,就是我们要重写的方法,首先我们自己编写了一个类,继承了AuthorizingRealm,并实现了doGetAuthenticationInfo方法,在doGetAuthenticationInfo中查询数据库,并将数据库中存放的用户名与密码封装成了一个AuthenticationInfo对象返回。

在这里插入图片描述
8、把用户输入的帐号密码与刚才你从数据库中查出来的帐号密码对比一下即可。token封装着用户的帐号密码,AuthenticationInfo封装着从数据库中查询出来的帐号密码。如果没有报异常,说明本次登录成功。
在这里插入图片描述
总结:
在这里插入图片描述
 1、首先将用户名和密码封装成token。
 2、Subject门面获取到token,并传递到内部的SecurityManager中。
 3、SecurityManager调用内部组件authenticator去验证。
 4、authenticator将token传递到Realm中去。
 5、最终由我们自定义Realm继承AuthorizingRealm,并实现doGetAuthenticationInfo方法。将数据库中的数据查询出来,放到Realm中去。shiro将会分析用户输入的token是否与数据库中查出来的一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值