shiro框架学习-2-springboot整合shiro及Shiro认证授权流程
1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
15 <groupId>org.apache.shiro</groupId>
16 <artifactId>shiro-spring</artifactId>
17 <version>1.4.0</version>
18 </dependency>
2. Shiro认证和授权流程
2.1 常用API:
//是否有对应的角色
subject.hasRole("root")
//获取subject名
subject.getPrincipal()
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin")
//检查是否有对应的角色
subject.hasRole("admin")
//退出登录
subject.logout();
2.2 shiro认证流程:

测试代码:
package net.xdclass.xdclassshiro; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test; /**
* shiro认证过程:
* 1.构造SecurityManager环境
* 2.调用Subject.login()执行认证
* 3.SecurityManager进行认证
* 4.Authenticator执行 认证
* 5.根据realm进行验证
*/
public class QuicksStratTest { /**
* accountRealm 相当于数据库的作用
*/
private SimpleAccountRealm accountRealm = new SimpleAccountRealm(); private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); @Before
public void init() {
//初始化数据源
accountRealm.addAccount("lch", "123");
accountRealm.addAccount("jack", "345");
//构建环境
defaultSecurityManager.setRealm(accountRealm); } @Test
public void testAuthentication() {
//设置当前上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
//设置当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
//模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
// 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
subject.login(usernamePasswordToken);
System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 打印true }
}
上面这个login方法里面 ,会调用认证器对 usernamePasswordToken 中的用户信息进行认证
2.3 shiro授权流程:

测试代码:
package net.xdclass.xdclassshiro; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test; /**
* shiro授权过程及常用API:
* 1.构造SecurityManager环境
* 2.Subject执行授权
* 3.SecurityManager进行认证授权
* 4.Authenticator执行授权
* 5.根据realm进行授权验证
*/
public class QuicksStratTest2 { /**
* accountRealm 相当于数据库的作用
*/
private SimpleAccountRealm accountRealm = new SimpleAccountRealm(); private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); @Before
public void init() {
//初始化数据源,入参加入用户角色
accountRealm.addAccount("lch", "123","root","admin");
accountRealm.addAccount("jack", "345","user");
//构建环境
defaultSecurityManager.setRealm(accountRealm);
} @Test
public void testAuthentication() {
//设置当前上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
//设置当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
//模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
// 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
subject.login(usernamePasswordToken); System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 结果:true
//最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
System.out.println("是否有对应的角色:" + subject.hasRole("root")); // 结果:true
//获取登录 账号
System.out.println("getPrincipal():" + subject.getPrincipal()); // getPrincipal():lch
subject.logout();
System.out.println("logout后认证结果:" + subject.isAuthenticated()); //logout后认证结果:false }
}
subject.hasRole()方法,实际上是调用SecurityManager的hasRole方法进行权限校验:

SecurityManager的hasRole方法,又是调用authorizer的hasRole方法去校验,

它有三个实现类:

测试代码中使用的 SimpleAccountRealm 是继承自 AuthorizingRealm,所以这里我们进入第一个实现类AuthorizingRealm 里面,发现它的授权逻辑如下:


shiro框架学习-2-springboot整合shiro及Shiro认证授权流程的更多相关文章
- 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战
========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...
- shiro框架学习-5-自定义Realm
1. 自定义Realm基础 步骤: 创建一个类 ,继承AuthorizingRealm->AuthenticatingRealm->CachingRealm->Realm 重写授权方 ...
- shiro框架学习-1-shiro基本概念
1. 什么是权限控制 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源, ...
- shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密
1. shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...
- shiro框架学习-8-shiro缓存
1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...
- shiro框架学习-4- Shiro内置JdbcRealm
1. JdbcRealm 数据库准备 JdbcRealm就是用户的角色,权限都从数据库中读取,也就是用来进行用户认证授权的安全数据源更换为从数据库中读取,其他没有差别,首先在数据库创建三张表: CR ...
- Activiti工作流学习之SpringBoot整合Activiti5.22.0实现在线设计器(二)
一.概述 网上有很多关于Eclipse.IDEA等IDE插件通过拖拽的方式来画工作流程图,个人觉得还是不够好,所以花点时间研究了一下Activiti在线设计器,并与SpringBoot整合. 二.实现 ...
- Java学习之SpringBoot整合SSM Demo
背景:在Java Web中Spring家族有着很重要的地位,之前JAVA开发需要做很多的配置,一堆的配置文件和部署调试一直是JavaWeb开发中的一大诟病,但现在Spring推出了SpringBoot ...
随机推荐
- MYSQL5.5 linux安装
1.常规的编译安装MYSQL 此种方法使用所有Mysql5.0 - 5.1 系列产品 比较常规的编译方式 2. 采用cmake 方式编译安装Mysql 3.二进制安装方式 免编译安装MYSQL 4.如 ...
- Win10成功安装IIS后浏览器打开localhost正确显示的页面
- HDU 1029 Ignatius and the Princess IV (动态规划、思维)
Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32767 K ( ...
- [转帖]linux学习问题总结
linux学习问题总结 https://www.cnblogs.com/chenfangzhi/p/10661946.html 学习作者的思路 目录 一.环境变量和普通变量的区别 二.rsyslog和 ...
- 开发完成的springboot项目扩展 swagger
第一步:pom.xml 引入 swagger 配置 <swagger.version>2.9.2</swagger.version> <!--swagger start- ...
- 手撕ES6--Promise
手撕ES6--Promise:https://www.jianshu.com/p/0925eae38d2c 手写一个Promise,附源码分析:https://blog.csdn.net/weixin ...
- python中对多态和多态性的理解
python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...
- 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”
之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...
- 如何跳出iframe父级,打开一个链接
假设使用window的跳转方法 ①window.parent.frames.location.href = "1.html"; //可以跳出iframe父级 此方法 ...
- Java Script 基本知识点
JavaScript是一种基于对象和事件驱动的脚本语言,它提供了一些专有的类.对象及函数 1.基本数据类型 JavaScript提供了4种基本的数据类型用来 ...