shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

1. 添加依赖

 1         <dependency>
 2             <groupId>org.springframework.boot</groupId>
 3             <artifactId>spring-boot-starter-web</artifactId>
 4         </dependency>
 5         <dependency>
 6             <groupId>mysql</groupId>
 7             <artifactId>mysql-connector-java</artifactId>
 8         </dependency>
 9         <dependency>
10             <groupId>org.springframework.boot</groupId>
11             <artifactId>spring-boot-starter-test</artifactId>
12             <scope>test</scope>
13                 </dependency>
14         <dependency>
15             <groupId>org.apache.shiro</groupId>
16             <artifactId>shiro-spring</artifactId>
17             <version>1.4.0</version>
18         </dependency>
19                       

2. Shiro认证和授权流程

2.1 常用API:

//是否有对应的角色
subject.hasRole("root")
//获取subject名
subject.getPrincipal()
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin")
//检查是否有对应的角色
subject.hasRole("admin")
//退出登录
subject.logout();

2.2 shiro认证流程:

测试代码:

 1 package net.xdclass.xdclassshiro;
 2
 3 import org.apache.shiro.SecurityUtils;
 4 import org.apache.shiro.authc.UsernamePasswordToken;
 5 import org.apache.shiro.mgt.DefaultSecurityManager;
 6 import org.apache.shiro.realm.SimpleAccountRealm;
 7 import org.apache.shiro.subject.Subject;
 8 import org.junit.Before;
 9 import org.junit.Test;
10
11 /**
12  * shiro认证过程:
13  * 1.构造SecurityManager环境
14  * 2.调用Subject.login()执行认证
15  * 3.SecurityManager进行认证
16  * 4.Authenticator执行 认证
17  * 5.根据realm进行验证
18  */
19 public class QuicksStratTest {
20
21     /**
22      * accountRealm 相当于数据库的作用
23      */
24     private SimpleAccountRealm accountRealm = new SimpleAccountRealm();
25
26     private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
27
28     @Before
29     public void init() {
30         //初始化数据源
31         accountRealm.addAccount("lch", "123");
32         accountRealm.addAccount("jack", "345");
33         //构建环境
34         defaultSecurityManager.setRealm(accountRealm);
35
36     }
37
38     @Test
39     public void testAuthentication() {
40         //设置当前上下文
41         SecurityUtils.setSecurityManager(defaultSecurityManager);
42         //设置当前subject(application应用的user)
43         Subject subject = SecurityUtils.getSubject();
44         //模拟用户输入
45         UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
46         // 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
47         subject.login(usernamePasswordToken);
48         System.out.println("认证结果(是否已授权):" + subject.isAuthenticated());  // 打印true
49
50
51     }
52 }

上面这个login方法里面 ,会调用认证器对 usernamePasswordToken 中的用户信息进行认证

2.3 shiro授权流程:

测试代码:

 1 package net.xdclass.xdclassshiro;
 2
 3 import org.apache.shiro.SecurityUtils;
 4 import org.apache.shiro.authc.UsernamePasswordToken;
 5 import org.apache.shiro.mgt.DefaultSecurityManager;
 6 import org.apache.shiro.realm.SimpleAccountRealm;
 7 import org.apache.shiro.subject.Subject;
 8 import org.junit.Before;
 9 import org.junit.Test;
10
11 /**
12  * shiro授权过程及常用API:
13  * 1.构造SecurityManager环境
14  * 2.Subject执行授权
15  * 3.SecurityManager进行认证授权
16  * 4.Authenticator执行授权
17  * 5.根据realm进行授权验证
18  */
19 public class QuicksStratTest2 {
20
21     /**
22      * accountRealm 相当于数据库的作用
23      */
24     private SimpleAccountRealm accountRealm = new SimpleAccountRealm();
25
26     private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
27
28     @Before
29     public void init() {
30         //初始化数据源,入参加入用户角色
31         accountRealm.addAccount("lch", "123","root","admin");
32         accountRealm.addAccount("jack", "345","user");
33         //构建环境
34         defaultSecurityManager.setRealm(accountRealm);
35     }
36
37     @Test
38     public void testAuthentication() {
39         //设置当前上下文
40         SecurityUtils.setSecurityManager(defaultSecurityManager);
41         //设置当前subject(application应用的user)
42         Subject subject = SecurityUtils.getSubject();
43         //模拟用户输入
44         UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
45         // 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
46         subject.login(usernamePasswordToken);
47
48         System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 结果:true
49         //最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
50         System.out.println("是否有对应的角色:" + subject.hasRole("root"));   // 结果:true
51         //获取登录 账号
52         System.out.println("getPrincipal():" + subject.getPrincipal());  // getPrincipal():lch
53         subject.logout();
54         System.out.println("logout后认证结果:" + subject.isAuthenticated());  //logout后认证结果:false
55
56
57     }
58 }
subject.hasRole()方法,实际上是调用SecurityManager的hasRole方法进行权限校验:

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

它有三个实现类:

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

原文地址:https://www.cnblogs.com/enjoyjava/p/12057947.html

时间: 2024-08-04 22:04:23

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程的相关文章

SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统

1.前言本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelper.Mapper插件.druid.dataTables.ztree.jQuery 开发工具:intellij idea 数据库:mysql.redis 2.表结构还是是用标准的5张表来展现权限.如下图:image 分别为用户表,角色表,资源表,用户角色表,角色资源表.在这个demo中使用了mybat

shiro框架学习-4- Shiro内置JdbcRealm

1.  JdbcRealm 数据库准备 JdbcRealm就是用户的角色,权限都从数据库中读取,也就是用来进行用户认证授权的安全数据源更换为从数据库中读取,其他没有差别,首先在数据库创建三张表: CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `password` varchar(100) DEFAULT NULL, `password_sa

shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.apache.shiro.web.filter.mgt; import java.util.LinkedHashMap; import ja

shiro框架学习-8-shiro缓存

1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有一个CacheManager——缓存管理器,可以使用 redis, hashmap, ehcache等作为缓存,可以在CacheManager中自定义. shiro中提供了对认证信息和授权信息的缓存,默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的(因为授权的数据量大).Authen

源码分析shiro认证授权流程

1. shiro介绍 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务.并且相对于其他安全框架,Shiro要简单的多. 2. shiro源码概况 先要了解shiro的基本框架(见http://www.cnblogs.com/davi

shiro框架学习-3- Shiro内置realm

1. shiro默认自带的realm和常见使用方法 realm作用:Shiro 从 Realm 获取安全数据 默认自带的realm:idae查看realm继承关系,有默认实现和自定义继承的realm 两个概念 principal : 主体的标示,可以有多个,但是需要具有唯一性,常见的有用户名,手机号,邮箱等 credential:凭证, 一般就是密码 所以一般我们说 principal + credential 就账号 + 密码 开发中,往往是自定义realm , 即集成 Authorizing

shiro框架学习-9-shiroSession

1.什么是会话session : 用户和程序直接的链接,程序可以根据session识别到哪个用户,和javaweb中的session类似 2. 什么是会话管理器SessionManager : 会话管理器管理所有subject的所有操作,是shiro的核心组件,它是一个接口,定义如下: public interface SessionManager { // 开启一个session Session start(SessionContext var1); // 根据指定的key获取session

dubbo学习(三) springboot整合dubbo mybatis mysql

dubbo-admin查看服务和服务提供方配置 服务消费方配置 和web 整合相对复杂一些,常出现的问题是Controller中 有@Reference配置的属性  没注入进来而调用时报null 异常 原文地址:https://www.cnblogs.com/LDDXFS/p/9941203.html

SpringBoot 整合 oauth2实现 token 认证

参考地址:https://www.jianshu.com/p/19059060036b session和token的区别: session是空间换时间,而token是时间换空间.session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占用空间. sessionId失效问题和token内包含. session基于cookie,app请求并没有cookie . token更加安全(每次请求都需要带上) Oauth2 密码授权流程 在oauth2协议里,每一个应用都有自己的一个