一文读懂 Shiro 登录认证全流程

  • 登录入口
  • 执行登录
  • UserRealm

Apache Shiro 是 Java 的一个安全框架。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。那么关于 Shiro 登录认证的执行流程是怎样的呢?下面我们来一起跟者源码看 Shiro 的登录认证流程。

登录入口

首先我们找到登录执行入口 LoginController.java,找到执行登录逻辑的代码

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

执行登录

下面我们来看 subject.login(token),点进去看到源码信息

主要通过 securityManager 安全管理器调用 securityManager.login(this, token);方法,下面我们继续跟进 securityManager.login(this, token)方法内部来看
securityManager.login(this, token)
点进去 securityManager.login(this, token)方法可以看到 info = this.authenticate(token)

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

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

可以看到
this.doAuthenticate(token)
继续跟进去看 doAuthenticate(token)方法的实现

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

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

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

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

UserRealm

在执行登录认证的时候需要选择我们自己实现的 realm 方法,自定义 UserRealm 实现登录校验

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

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{UsernamePasswordToken upToken = (UsernamePasswordToken) token;String username = upToken.getUsername();String password = "*****";if (upToken.getPassword() != null){password = new String(upToken.getPassword());}SysUser user = null;try{user = loginService.login(username, password);}catch (CaptchaException e){throw new AuthenticationException(e.getMessage(), e);}catch (UserNotExistsException e){throw new UnknownAccountException(e.getMessage(), e);}catch (UserPasswordNotMatchException e){throw new IncorrectCredentialsException(e.getMessage(), e);}catch (UserPasswordRetryLimitExceedException e){throw new ExcessiveAttemptsException(e.getMessage(), e);}catch (UserBlockedException e){throw new LockedAccountException(e.getMessage(), e);}catch (RoleBlockedException e){throw new LockedAccountException(e.getMessage(), e);}catch (Exception e){log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage());throw new AuthenticationException(e.getMessage(), e);}SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());return info;}

再次查看 AuthenticatingRealm.getAuthenticationInfo(AuthenticationToken token)
AuthenticatingRealm.getAuthenticationInfo(AuthenticationToken token)

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

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

点进去可以看到

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

一文读懂 Shiro 登录认证全流程相关推荐

  1. 一文读懂供应链仓储管理全流程

    一.仓储网络布局 园区基本情况 一般情况下:仓库的选址规划布局,主要根据订单量的区域分布及未来增涨潜力来进行需求评估,重点考虑的几个评估维度,如下:1.订单集中区域的周边车程范围(具体视库源,业务产品 ...

  2. 一文读懂CCSC—数据安全认证

    CCSC-数据安全概述 网络安全能力认证(英文名称Certification for Cyber Security Competence)-数据安全方向, 简称CCSC-数据安全,课程基于数据安全咨询 ...

  3. 一文读懂 SAP 全球认证

    起步于1995年的 SAP 全球认证计划针对产品线拥有一套完整的认证体系,旨在验证特定 SAP 解决方案的专业知识和经验.认证级别分为三个层次,分别为初级顾问认证,专家级顾问认证和大师级顾问认证,每一 ...

  4. 一文读懂查询sql的执行流程和底层原理

    前言 天天和数据库打交道,一天能写上几十条SQL语句,但你知道我们的系统是如何和数据库交互的吗?MySQL如何帮我们存储数据.又是如何帮我们管理事务?-是不是感觉真的除了写几个「select * fr ...

  5. 量子计算机芯片的制造过程,全干货!一文读懂芯片制造及量子芯片!

    原标题:全干货!一文读懂芯片制造及量子芯片! 最近两个月,因为一系列事情,大家对国内芯片产业的关注度日益增加. 那么,什么是芯片?如何制造芯片?涉及到多少高科技?目前的芯片产业将会有哪些挑战? 在这里 ...

  6. 一文读懂PMP项目管理资格认证考试

    对于第一次参加PMP项目管理认证考试的考生来说,对PMP还在一知半解的阶段.到底什么是PMP,考这个证又有什么用?怎样报名考试?报名又有什么条件呢? 科科过一文解答您所有的疑问,带您全方位了解PMP项 ...

  7. lcl手术和飞秒区别_主流近视手术大解密!一文读懂全飞秒和ICL的区别

    原标题:主流近视手术大解密!一文读懂全飞秒和ICL的区别 不戴镜,世界模糊一片 戴上眼镜,颜值高分立减 隐形眼镜护理繁琐还怕伤角膜 升学.参军.就业时还受限 还要担心随时可能发生的 网脱.青光眼-- ...

  8. 一文读懂滤波器的线性相位,全通滤波器,群延迟

    转载自https://blog.csdn.net/s09094031/article/details/83755663 一文读懂滤波器的线性相位,全通滤波器,群延迟 1. 延迟 2. 全通滤波器 3. ...

  9. 一文读懂什么是EPP、EDR、CWPP、HIDS及业内主流产品

    一文读懂什么是EPP.EDR.CWPP.HIDS及业内主流产品 当前终端安全概念包括:针对云工作负载保护平台cwpp.端点防护平台epp和终端全检测响应平台edr.HIDS品类(长亭牧云.青藤万相)更 ...

最新文章

  1. 如何使用消息队列解决分布式事物?
  2. 专访清华AIR院长张亚勤:AI在疫情中很重要,但却很「表面」
  3. hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
  4. java 根据类名示例化类_Java类类getEnclosingClass()方法及示例
  5. 让大数据分析更简单,4步教你玩转MongoDB BI Connector
  6. 云现场 | 别等到WiFi断了 才明白云管理网络的重要性
  7. “附近的小程序”可以直接找“餐饮” 非管理员也能登录小程序了
  8. linux四剑客-grep/find/sed/awk/详解-技术流ken
  9. es 使用ik停词_ES使用IK分词器
  10. paip.为什么使用多线程的原因.
  11. 细数实现流水灯的三种代码形式
  12. android 401,Android HttpClient身份验证始终返回401代码
  13. 国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)
  14. Java-----关于IO流的总结
  15. 【2020】年学而思全套暑秋寒春(1376G)
  16. Python:for...in range() 、 for...in enumerate() 、for...in() 、for...in zip()的用法
  17. GoDaddy域名过户PUSH攻略
  18. 【Redis Cluster集群】redis cluster 多mster写入,读写分离,高可用
  19. golang标示废弃方法api
  20. 杂事缠身总分神,不妨试试番茄钟

热门文章

  1. SoftPerfect NetWorx中管理流量和宽带设备工具
  2. HMAC的签名生成方式
  3. html5网站访问地图
  4. 计算机一级考试操作题在线练习,计算机一级考试Photoshop练习题(带答案)
  5. 计算机u盘启动会改变c盘吗,电脑重装系统时 我已经用U盘启动把系统备份在了C盘,但是重新启动电脑时无法自行安装系统,可有解法...
  6. Vue中使用Fullcalendar日历开发日程安排
  7. python版羊了个羊
  8. SSM学习回顾 DAY1
  9. Mavenir推出云原生、模块化和基于微服务的融合计费解决方案(CCS)
  10. QML中使用 VLC-Qt 播放网络视频流(附实例)