shiro学习(4):shiro认证流程

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之Map函数

转载 https://www.cnblogs.com/gongxr/p/7247855.html# map()函数使用举例 # 功能&#xff1a;map()接受一个函数f和一个或多个list&#xff0c;将f依次作用在list的每个元素&#xff0c;得到一个新的列表 # 语法&#xff1a;map(方法名&#xff0c;列表&#xff0c;[列表2]) #…

Windows Mobile开发应该选择哪种开发语言?

Windows Mobile开发应该选择哪种开发语言&#xff1f;这个问题曾经被问了很多很多次&#xff0c;特别是打算开始学习Windows Mobile开发的朋友。Native Code or Managed Code? C/C or C#/VB.NET? 简单的说&#xff0c;Native Code的代码执行效率高&#xff0c;开发效率低&…

在ASP.NET MVC中实现Select多选

我们知道&#xff0c;在ASP.NET MVC中实现多选Select的话&#xff0c;使用Html.ListBoxFor或Html.ListBox方法就可以。在实际应用中&#xff0c;到底该如何设计View Model&#xff0c; 控制器如何接收多选Select的选中项呢&#xff1f; 实现效果如下&#xff1a; 初始状态某些选…

shiro学习(5):ini文件和自定义realm

工具idea 首先创建maven项目 配置文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

关于python中带下划线的变量和函数 的意义

转载:https://www.cnblogs.com/wangshuyi/p/6096362.html总结:变量:1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量,3. 大写加下划线的变量: 标明是 不会发生改变的全局变量函数:1. 前带…

几个简单的正则小例子

1 ^[\w][\w\.-]*[\w][\w-]*(?<val>\.\w){0,2}$ 电子邮件2 ^http://([\w-]*\.)([\w-]*)(/\w)*([\w-\.?%&]*)$ URL3 ^1[3,5]{1}\d{9}$ 手机号码4 ^(0\d{2,3})[-]?\d{7,8}(-\d{4})*$|\(0\d{2,3}\)[-]?\d{7,8}(-\d{4})*$ 电话号码5 Js替换字符串两边非空字符6 String…

康拓展开学习笔记

康拓展开 给出一个全排列&#xff0c;求他是第几个全排列称为康拓展开。 暴力康拓展开 对于一个全排列来说&#xff0c;从左往右第i位&#xff0c;有 n 1 - i 种选择。如果用变进制数表示的话&#xff0c;这一位就是 n 1 - i 进制的数&#xff0c;如果这一位选择了第k种情况&…

歌谣对自己的“自勉“

前言 为什么突然想写一篇文章呢&#xff0c;可能是源于个人吧&#xff0c;每天睡觉前都会思考一下是否达到了以后想要的生活。很显然答案是没有&#xff0c;不然我现在也不和大家在一起侃侃而谈。讲真&#xff08;这是我室友经常说的一句话&#xff09;&#xff0c;我是参与安…

网页中的按钮无法显示问题解决

今天有朋友反映她的电脑有问题&#xff0c;打开的网页中按纽无法显示&#xff0c;例如&#xff1a;163.com的邮箱中&#xff0c;发送邮件的按钮无法显示。 问了她一下是不是修改过背景色&#xff0c;她说是。就知道问题所在了。 解决方法&#xff1a;IE-工具-Internet选项-辅助…

python之Map函数 reduce 函数

转载&#xff1a;https://www.cnblogs.com/gongxr/p/7247855.htmlpython之Map函数# map()函数使用举例 # 功能&#xff1a;map()接受一个函数f和一个或多个list&#xff0c;将f依次作用在list的每个元素&#xff0c;得到一个新的列表 # 语法&#xff1a;map(方法名&#xff0c;…

你的心事我全知晓——心情日记小程序丨实战

闲暇之余&#xff0c;听媳妇嘀咕说要给她做一个能表达她每日心情的小程序&#xff0c;只能她在上面发东西。既然媳妇发话了&#xff0c;就花点心思做一个吧&#xff0c;因为没有UI图&#xff0c;所有布局全靠自己瞎编&#xff0c;下面结合图片和代码跟大家讲解下实现过程&#…

java面试题28 牛客 下面有关java classloader说法错误的是?

java面试题28 牛客 下面有关java classloader说法错误的是? A Java默认提供的三个ClassLoader是BootStrap ClassLoader&#xff0c;Extension ClassLoader&#xff0c;App ClassLoader B ClassLoader使用的是双亲委托模型来搜索类的 C JVM在判定两个class是否相同时&#x…

css居中无效的解决办法

前几天自己用css做居中的效果 margin: 0 auto,平时我都事这样来写的&#xff0c;不过这次就是不能实现居中的效果&#xff0c;检查代码&#xff0c;原来是自己没有添加DTD语句&#xff0c;即&#xff1a;&#xff1c;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitiona…

spark on yarn 部署问题

spark on yarn 部署报:java.io.IOException: Resource file:/usr/local/spark-1.6.3-bin-hadoop2.6/lib/spark-assembly-1.6.3-hadoop2.6.0.jar changed on src filesystem (expected 1530607524000, was 1478125561000 解决&#xff1a;spark-env.sh 之前配置 export HADOOP_C…

java面试题29 牛客 以下关于集合类ArrayList、LinkedList、HashMap描述

java面试题29 牛客 以下关于集合类ArrayList、LinkedList、HashMap描述错误的是&#xff08;&#xff09; A HashMap实现Map接口&#xff0c;它允许任何类型的键和值对象&#xff0c;并允许将null用作键或值 B ArrayList和LinkedList均实现了List接口 C 添加和删除元素时&am…

使用python爬取东方财富网机构调研数据

最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了javascript网络访问,然后将服务器返回的数据插入网页,无法通过网址直接获取对应页…

spark on yarn webUI logs不能查看

执行spark on yarn 执行&#xff1a;./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster --executor-memory 1G --num-executors 3 ./lib/spark-examples-1.6.3-hadoop2.6.0.jar 10 命令执行成功后在yarn 资源管理界面查看不了logs 参考博…

post提交,WPF,Silverlight(加深记忆写一遍)

asp.net当<form id"form1" runat"server">默认post提交是提交到本页&#xff0c;每次提交会验证viewstate所以想提交到其它页会出错&#xff0c;如果真想提交到其它页&#xff0c;那么把其它页的viewstate标识改成和这个页一样 当去掉runat"ser…

java面试题30:牛客 下列哪项不属于jdk1.6垃圾收集器?

java面试题30&#xff1a;牛客 下列哪项不属于jdk1.6垃圾收集器&#xff1f; A:Serial收集器 B&#xff1a;parNew收集器 C:CMS收集器 D:G1收集器 1.Serial收集器 单线程收集器&#xff0c;收集时会暂停所有工作线程&#xff08;我们将这件事情称之为Stop The World&…

2019最新Python爬虫高频率面试题总结(一)

今天给大家出一个关于Python爬虫面试题的总结&#xff0c;相对于来说出现频率比较高的一些&#xff01;1. 为什么 requests 请求需要带上 header&#xff1f;原因是&#xff1a;模拟浏览器&#xff0c;欺骗服务器&#xff0c;获取和浏览器一致的内容header 的形式&#xff1a;字…