Shiro登录校验流程实现与分析

什么是Shiro

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

三个核心组件

Subject, SecurityManager 和 Realms.
①Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
②SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
③Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

登录认证过程简述

①调用subject.login方法进行登录,其会自动委托给securityManager,login方法进行登录;
②securityManager通过 Authenticator(认证器)进行认证
③Authenticator的实现ModularRealmAuthenticaton调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm ( shiro自带,相当于数据源) ;

④IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null ,如果找到则匹配密码,匹配密码成功则认证通过。

image.png

具体实现

  <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version></dependency>

image.png

package com.swl;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;/*** <Description>ShiroTest<br>** @author DaShi<br>* @CreateDate 2019-02-15 09:43 <br>*/
public class ShiroTest {@Testpublic void loginTest() throws Exception{//创建IniSecurityManager工程对象:加载配置文件Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");//通过工厂对象创建SecurityManager对象SecurityManager securityManager = factory.getInstance();// 将SecurityManager绑定到当前运行环境中,让系统随时可以访问SecurityManager对象SecurityUtils.setSecurityManager(securityManager);//创建登录主体 注意:此时主体没有经过验证,仅仅是个空的对象Subject subject = SecurityUtils.getSubject();//绑定主体登陆的身份、凭证 即账号密码UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");//主体登陆try{subject.login(token);}catch (Exception e){//抛错误}//登陆判断System.out.println("登录结果" + subject.isAuthenticated() );//登出判断subject.logout();System.out.println("登出结果" + subject.isAuthenticated());}
}

结果:

image.png

源码分析

①我们在登录操作时打好断点,debug运行

image.png

②我们进入到subject主体的实现类中,注意标记部分,subject将登录操作委托给了securitymanager,参数除了页面传入的token以外还有subject主体

image.png

③进入到securitymanager实现类中,开始执行认证方法

image.png

④点进去看一下,我们发现securitymanager将认证任务委托给了认证器,由认证器执行认证方法

image.png

⑤我们进入到认证方法中

image.png

⑥继续执行doAuthenticate,我们发现这里面有个realm,他是啥呢?

image.png

我们看到realms这个集合里面其实就是我们之前加载的realms.ini中的内容

image.png

⑦因为我们只有一个realm,所以进入了true条件中,这时我们刚才标记出的AuthenticationInfo出现了,看看他是啥

image.png

点进去看看

image.png

看不懂,继续进去看看,我们看到他先把我们的token包装成了 UsernamePasswordToken的形式 然后执行了getuser()参数是我们页面传进来的token的name

image.png

⑧我们看一下里面是什么,是通过页面传入的那个用户名,去我们刚才realm里面的user列表去查找有没有这个用户 如果找到了,将realm中该用户信息返回上一层

image.png

⑨这时我们可以看到account中包含了张三的信息

image.png

⑩接下来我们继续返回上一层,因为我们已经在realm中找到了页面输入的token的用户名,下一步进行密码验证

image.png

密码验证就很简单了,重点就是这个判断

image.png

其实就是把我们刚才取得的那个realm中的张三的密码和我们页面传入的密码比较

image.png

好了整个过程大概就是这个样子啦!!!

shiro学习(4):shiro认证流程相关推荐

  1. Shiro学习--Apache Shiro Architecture(Shiro架构)

    Apache Shiro Architecture 参考 http://shiro.apache.org/architecture.html 本文有点翻译的意思,是为了梳理Shiro的知识而做的Shi ...

  2. Shiro学习之Shiro授权的内部处理机制(六)

    1.在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等) 2.Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时, ...

  3. Shiro学习记录(详细)

    文章目录 Shiro学习记录 shiro核心组件 Spring Boot 整合 Shiro Shiro 整合 Thymeleaf Shiro学习记录 什么是 Shiro 官网:http://shiro ...

  4. 儿童CPC认证,儿童学习用品CPC认证

    儿童学习用品CPC认证流程,背包.书皮.便当包/盒.铅笔盒/袋等等,亚马逊可能随时要求提供儿童学习用品安全文件,以确认其合规. 应该提交相关文件? 如果您销售儿童学习用品,我们可能会要求您提供相关文件 ...

  5. 亚马逊儿童学习用品CPC认证

    在亚马逊,上架与儿童相关的产品,包括玩具.婴童用品等,会被要求上传相应的检测报告,否则将面临产品被下架.货款被扣留.被起诉等风险! 一.儿童学习用品示例 1.背包 背包是由塑料.布料.尼龙或其他材料制 ...

  6. Shiro学习笔记_02:shiro的认证+shiro的授权

    Shiro 学习笔记 本文基于B站UP主[编程不良人]视频教程[2020最新版Shiro教程,整合SpringBoot项目实战教程]进行整理记录,仅用于个人学习交流使用. 视频链接:https://w ...

  7. Shiro框架:Shiro简介、登陆认证入门程序、认证执行流程、使用自定义Realm进行登陆认证、Shiro的MD5散列算法

    一.Shiro介绍: 1.什么是shiro: (1)shiro是apache的一个开源框架,是一个权限管理的框架,实现用户认证.用户授权. (2)spring中有spring security,是一个 ...

  8. Shiro学习总结(3)——Apache Shiro身份认证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  9. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  10. Shiro学习笔记-----小组开发前后端分离项目---登陆认证盐值加密

    当下我正在参与的学校前后端分离的实习项目,有了登录系统的需求,于是我在了解到Shiro是当下主流的安全框 架后,毅然决然开启了学习Shiro的旅程 首先来谈谈什么是Shiro,Apache Shiro ...

最新文章

  1. Eclipse更改系统主题
  2. 学会这些套路和用词,Discussion不愁没思路
  3. 微信小程序实现滚动到指定位置
  4. 编写分段函数子函数_我从编写六个函数中学到的全部都做相同的事情
  5. Fei Labs:FIP-5提案已通过
  6. 刷题总结——Tree2cycle(hdu4714 树形dp)
  7. 日更第4期-2015-1-19-openFrameworks系列第三讲-面向对象的小球们
  8. cmake 指定平台编译arm64_Arm V7 V8处理器编译Target小提示
  9. 线性代数、微积分学习与回顾
  10. HiveSql 日期格式转换
  11. 机器学习 泛化误差和偏差-方差
  12. 关于计算机的CPU的发展历史,计算机CPU的全部发展历史
  13. c语言中有符号数的补码,[分享]带符号数的表示-----补码
  14. mysql data masking_Dynamic Data Masking 动态数据脱敏
  15. (转)(异常分析) org.hibernate.MappingException: entity class not found
  16. 3t服务器装linux系统如何分区,Linux 分区、格式化3T大容量存储分区
  17. latex参考文献中输入
  18. UE4 Matinee的动画倒播
  19. python scrapy 管道学习,并拿在行练手爬虫项目
  20. 音乐播放(Toggle PlayerPrefs)

热门文章

  1. CABasicAnimation动画
  2. 第十三章 Perl的面向对象编程
  3. 金陵科技学院计算机开设课程,金陵科技学院各专业介绍
  4. nginx集群_windows环境下搭建简单Nginx+Tomcat集群
  5. qt linux 添加库文件路径,Linux下Qt调用共享库文件.so
  6. wordpress发布文章时右侧边栏选择作者的功能代码
  7. 【51单片机快速入门指南】9:省电模式(低功耗)
  8. centos7.2 安装poco
  9. 浅谈进程间的消息传递
  10. 第一章 处理器体系结构