【Shiro】4.Springboot集成Shiro

news/2024/12/26 20:33:49/文章来源:https://www.cnblogs.com/luyj00436/p/18432852

https://blog.csdn.net/sco5282/article/details/134016549

前面已经学习了Shiro快速入门和缓存 。现在假定实际业务中需要完成以下功能:

1. 包含页面登录和首页。

2. 登录时需要连接数据库,完成登录认证和授权。

3. 登录时,密码需要加密。

4. 登录和授权信息能够缓存。

5. 授权演示两种模式,基于角色授权和基于资源授权。

前提条件

因为这里主要学习shiro,所以与shiro不相干的步骤和准备,尽量简单表示。

1. 新建SpringBoot的Web项目,并新建页面index.html(主页,对应路由ip:接口/index)和login.html(登录页面,对应路由ip:接口/login)。

2. mysql数据库包含用户、角色以及授权的表格(如下图)。这些表格的方法已在SpringBoot结合(Mybatis或Mybatisplus)形成基础的查询方法,我们演示的时候只要调用以上方法即可。

 引入依赖

这里我们需要引用需要的shiro和redis依赖项。

 1 <dependency>
 2     <groupId>org.apache.shiro</groupId>
 3     <artifactId>shiro-spring</artifactId>
 4     <version>1.13.0</version>
 5 </dependency>
 6 <!-- Redis 缓存-->
 7 <dependency>
 8     <groupId>org.springframework.boot</groupId>
 9     <artifactId>spring-boot-starter-data-redis</artifactId>
10     <version>2.5.15</version>
11 </dependency>
12 <dependency>
13     <groupId>org.springframework.data</groupId>
14     <artifactId>spring-data-redis</artifactId>
15     <version>2.5.12</version>
16 </dependency>

 添加Shiro配置类

根据已学过的知识,添加配置类ShiroConfiguratin

 1 @Configuration
 2 public class ShiroConfiguratin {
 3     @Autowired
 4     private RedisTemplate redisTemplate;
 5 
 6     // 1.创建 shiroFilter,负责拦截所有请求
 7     @Bean
 8     public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
 9         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
10         //给filter设置安全管理器
11         shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
12         //配置系统受限资源
13         //配置系统公共资源
14         Map<String,String> map = new HashMap<>();
15         // authc 请求这个资源需要认证和授权
16         map.put("/index", "authc");
17         //默认认证界面路径
18         shiroFilterFactoryBean.setLoginUrl("/login");
19         shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
20         return shiroFilterFactoryBean;
21     }
22 
23     //2.创建安全管理器
24     @Bean
25     public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm){
26         DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
27         //给安全管理器设置
28         defaultWebSecurityManager.setRealm(realm);
29         return defaultWebSecurityManager;
30     }
31 
32     /**
33      * 3.创建自定义realm
34      * @return
35      */
36     @Bean
37     public Realm getRealm(){
38         SysUserRealm sysUserRealm = new SysUserRealm();
39         // 设置缓存管理器
40         sysUserRealm.setCacheManager(new RedisCacheManage(redisTemplate)); // 自定义Redis数据库缓存方法
41         // 开启全局缓存
42         sysUserRealm.setCachingEnabled(true);
43         // 开启认证缓存并指定缓存名称
44         sysUserRealm.setAuthenticationCachingEnabled(true);
45         sysUserRealm.setAuthenticationCacheName("authenicationCache");
46         // 开启缓存授权并指定缓存名称
47         sysUserRealm.setAuthorizationCachingEnabled(true);
48         sysUserRealm.setAuthorizationCacheName("authenicationCache");
49         return sysUserRealm;
50     }
51 }

这里的配置类完成以下功能。

  • 完成拦截请求(登录index页面前,需要经过认证和授权认证和授权页面(login))
  • 创建安全管理(添加域管理器)
  • 设置自定义域,完成缓存的设置(使用Redis缓存,详见:https://www.cnblogs.com/luyj00436/p/18446712)。

根据之前学到的知识,自定义域完成了认证和授权 SysUserRealm  。

 1 public class SysUserRealm extends AuthorizingRealm {
 2     @Autowired
 3     private SysUserMapper sysUserMapper;        // 用户查询
 4     /**
 5      * 授权
 6      * @param principals the primary identifying principals of the AuthorizationInfo that should be retrieved.
 7      * @return
 8      */
 9     @Override
10     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
11         // 从系统返回的身份信息集合中获取主身份信息(用户名)
12         String primaryPrincipal = (String) principals.getPrimaryPrincipal();
13         // TODO 根据用户名获取当前用户的角色信息,以及权限信息
14         SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
15         // 将数据库中查询到的角色信息赋值给权限对象 
16         simpleAuthorizationInfo.addRole("admin");
17         simpleAuthorizationInfo.addRole("user");
18         // 将数据库中查询权限信息赋值给权限对象
19         simpleAuthorizationInfo.addStringPermission("user:*:01");
20         simpleAuthorizationInfo.addStringPermission("product:create");
21         return simpleAuthorizationInfo;
22     }
23 
24     /**
25      * 认证
26      * @param token the authentication token containing the user's principal and credentials.
27      * @return
28      * @throws AuthenticationException
29      */
30     @Override
31     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
32         // 在token中获取用户名
33         String principal = (String) token.getPrincipal();   // 获取用户名
34         // 根据获取到的用户名查询数据(这里用id代替)
35         SysUser resUser = sysUserMapper.selectById(1);
36         if(principal.equals(resUser.getUsername())){
37             // 参数说明:用户|密码|当前realm的名字
38             return new SimpleAuthenticationInfo(principal,resUser.getPassword(), this.getName() );
39         }
40         return null;
41     }
42 }

 

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

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

相关文章

基于3peak 17串AFE芯片TPB76016-QP3R的电池BMS控制板方案

随着电动汽车、可再生能源存储设备以及便携式电子产品的普及,对高效、安全的电池管理系统(BMS)需求日益增加。17通道高精度电池管理产品—TPB76016,内置高精度基准,工作温度支持-40C to +125C,可广泛应用于动力电池、储能电池、以及其他消费类电池的BMS控制板。TPB76016-…

mysql登录遇到ERROR 1045问题解决方法

遇到 MySQL 登录时出现 ERROR 1045(访问被拒绝,用户名或密码错误),可以通过以下步骤来解决: 1. 确认用户名和密码检查用户名和密码:确认在连接数据库时输入的用户名和密码是否正确。 尝试在命令行中连接数据库,确认是否能成功登录:bashmysql -u your_username -p2. 重置…

网站提示连接数据库错误怎么解决

解决网站连接数据库错误通常需要检查以下几个方面:检查数据库连接参数确认数据库地址(hostname)、端口号、用户名和密码是否正确。 检查数据库名称是否正确。检查网络连接确保服务器与数据库之间的网络连通性正常。 如果是在云环境中,检查安全组设置或防火墙规则是否允许从…

验证码绕过爆破

验证码绕过爆破 图片验证码绕过 方法一、插件 xiapao 下载地址:https://github.com/smxiazi/NEW_xp_CAPTCHA/releases/tag/4.2 需要 python3.6 的环境来启动 sercer.py 服务,下载 python3.6 安装包,选择路径进行安装(不需要配置环境变量),然后再 pycharm 中打开文件,配置…

react 知识点汇总(非常全面)

React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。它的核心理念是“组件化”,即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX(JavaScript XML)。JSX 是一种 JavaScript 语法扩展,允许开发者在 JavaScript 代码中编写类似 HTML 的结构。…

大核注意力机制

一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核,减少了计算复杂性和内存占用。接着,我们介绍将这一机制…

2024熵密杯wp

第一部分:初始谜题这一部分算是开胃菜,形式也更像平时见到的CTF题目,三个题目都是python加密的,做出其中任意一个就可以进入第二部分,也就是一个更类似真实情境的大型密码渗透系统。但每个初始谜题都是有分数的,所以就算开了第二部分也当然要接着做。每个题目也都有前三血…

2024高校网络安全管理运维赛 wp

0x00 前言本文是关于“2024高校网络安全管理运维赛”的详细题解,主要针对Web、Pwn、Re、Misc以及Algorithm等多方向题目的解题过程,包含但不限于钓鱼邮件识别、流量分析、SQLite文件解析、ssrf、xxe等等。如有错误,欢迎指正。0x01 Misc签到给了一个gif,直接在线分帧得到syn…

张量矩阵乘法分块乘法概述

张量矩阵乘法分块乘法概述 介绍一下矩阵计算相关的内容, 从最基本的算法,到Cutlass这些线性代数模版库, 特别是Layout代数相关的内容,再逐渐细化到一些硬件实现访存优化和一些算子融合。 6.3.1 GEMM概述 1. GEMM定义 对于一个矩阵乘法, 定义如下: (6-1)一个矩阵乘法定义,如…

Java与线程

Java与线程 1. 线程的实现 线程是比进程更轻量级的调度执行单位,线程的引人,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。 主流的操作系统都提供了线程实…