shiro登录认证过程

shiro登录认证过程

登录方法

可以看到已经获取到了username、password和rememberMe ,为了接下来的认证过程,我们需要获取subject对象,也就是代表当前登录用户,并且要将username和password、rememberMe 两个变量设置到UsernamePasswordToken对象的token中, 调用SecurityUtils.getSubject().login(token)方法,将 token传入;
下面来看 subject.login(token)方法

主要通过securityManager安全管理器调用securityManager.login(this, token);方法,下面来看

方法中定义了AuthenticationInfo对象来接受从Realm传来的认证信息,进入authenticate(token)方法中


继续跟进去,进入authenticator.authenticate(token)方法

再继续跟进去看doAuthenticate(token)方法的实现

其中,this.assertRealmsConfigured();是判断当前的realm是否存在,不存在则抛出异常

当前项目中只配置了一个realm,则会进入doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken)方法,并且会将 realm和token作为参数传入,这里的realm其实就是自己定义的UserRealm,继续进入doSingleRealmAuthentication方法

这里会先判断realm是否支持token,然后进入else方法执行realm.getAuthenticationInfo(token)方法,继续跟进

this.getCachedAuthenticationInfo(token)这个方法是从shiro缓存中读取用户信息,如果没有,才从realm中获取信息。如果是第一次登陆,缓存中肯定没有认证信息,所以会执行this.doGetAuthenticationInfo(token)这个方法,

在执行登录认证的时候需要选择我们自己实现的realm方法

读取数据库信息进行验证,并封装成SimpleAuthenticationInfo中返回
再次查看getAuthenticationInfo

assertCredentialsMatch(token, info)方法用于密码校验,点进去可以看到

cm.doCredentialsMatch(token, info)执行密码校验

点进去可以看到

通过从token中取出的密码与从数据库取出的info中的密码进行比较,认证相同返回true;失败就返回false,并抛出AuthenticationException,将info返回到defaultSecurityManager中,到此认证过程结束
参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值