当前位置: 首页 > news >正文

SpringBoot+Shirp的权限管理

目录

怎么实现动态菜单

1.html页面

2.获取动态菜单

Shiro权限刷新

1. 配置Shiro

2. 创建权限刷新服务

3. 调用权限刷新服务

注意事项

如何更新ShiroFilter初始权限


怎么实现动态菜单

1.html页面

 <ul class="nav side-menu"><!--第一重循环,循环32次,有6条满足--><li th:if="${right1.rightType=='Folder'}" th:each="right1:${session.loginUser.role.rights}"><a><i class="fa fa-home"></i>  <span th:text="${right1.rightText}">一级菜单</span><span class="fa fa-chevron-down"></span></a><ul class="nav child_menu"><li th:if="${right2.rightType=='Document' && right2.rightParentCode==right1.rightCode}" th:each="right2:${session.loginUser.role.rights}"><a th:href="@{${right2.rightUrl}}" href="javascript:;" th:text="${right2.rightText}">二级菜单</a></li></ul></li></ul>

2.获取动态菜单

 // 获得权限信息User user = (User) principalCollection.getPrimaryPrincipal();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 动态授权:从数据库中获取角色和权限Role role = user.getRole();if (role != null) {info.addRole(role.getRoleName()); // 动态设置角色Set<Right> rights = role.getRights();if (rights != null && !rights.isEmpty()) {for (Right right : rights) {info.addStringPermission(right.getRightCode()); // 动态设置权限}}}

Shiro权限刷新

在Spring Boot项目中,使用Apache Shiro进行权限管理时,实现权限刷新通常涉及以下几个步骤:

  1. 理解权限刷新需求
    • 权限刷新通常意味着用户的权限在运行时发生了变化,需要更新Shiro中的安全上下文,以确保后续访问控制能够反映最新的权限状态。
  2. 更新权限数据
    • 首先,确保你的权限数据(如角色、权限等)在数据库中或某个持久化存储中是可以动态更新的。
  3. 重新加载权限
    • 当权限数据发生变化时,你需要一种机制来重新加载用户的权限信息。这通常涉及从数据库或其他数据源重新获取权限数据,并更新Shiro的Subject对象。
  4. 实现权限刷新逻辑
    • 你可以通过编写一个服务类来处理权限刷新逻辑。这个服务类将负责从数据源获取最新的权限信息,并调用Shiro的API来更新当前用户的权限。

以下是一个简单的示例,展示了如何在Spring Boot Shiro项目中实现权限刷新:

1. 配置Shiro

确保你已经正确配置了Shiro,包括Realm、CacheManager等。

2. 创建权限刷新服务

import org.apache.shiro.SecurityUtils;  
import org.apache.shiro.mgt.SecurityManager;  
import org.apache.shiro.subject.Subject;  
import org.apache.shiro.subject.PrincipalCollection;  
import org.apache.shiro.realm.AuthorizingRealm;  
import org.apache.shiro.authz.AuthorizationInfo;  
import org.apache.shiro.authz.SimpleAuthorizationInfo;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  import java.util.Set;  @Service  
public class PermissionRefreshService {  @Autowired  private UserService userService; // 假设你有一个UserService来管理用户信息  @Autowired  private AuthorizingRealm realm; // 你的Shiro Realm实现  public void refreshPermissions(Long userId) {  // 获取当前Subject  Subject currentUser = SecurityUtils.getSubject();  // 假设你的Realm使用用户名作为Principal  String username = getCurrentUsername(currentUser);  // 从数据库或其他数据源获取最新的权限信息  Set<String> roles = userService.getRolesByUserId(userId);  Set<String> permissions = userService.getPermissionsByUserId(userId);  // 创建AuthorizationInfo对象并设置权限和角色  AuthorizationInfo authInfo = new SimpleAuthorizationInfo();  authInfo.setRoles(roles);  authInfo.setStringPermissions(permissions);  // 更新Realm中的权限信息  realm.doClearCache(PrincipalCollection.fromRealmNames(username));  realm.init(); // 这一步可能不是必需的,取决于你的Realm实现  // 触发Shiro重新加载权限(这一步通常通过清除缓存和访问控制检查自动完成)  // 你也可以手动调用某些Shiro API来确保权限被重新加载,但这通常不是必需的  // 注意:在某些情况下,你可能需要让用户重新登录或重新认证以刷新权限  // 这可以通过注销当前用户并立即重新登录来实现  // currentUser.logout(); // 注销用户  // 然后重定向到登录页面或自动登录(取决于你的需求)  }  private String getCurrentUsername(Subject subject) {  // 根据你的Principal类型获取用户名  // 这里假设Principal是一个String类型的用户名  return (String) subject.getPrincipal();  }  
}

3. 调用权限刷新服务

在你的业务逻辑中,当用户的权限发生变化时,调用PermissionRefreshServicerefreshPermissions方法来刷新权限。

注意事项

  • 缓存:Shiro使用缓存来存储权限信息以提高性能。因此,在权限发生变化时,你需要确保Shiro的缓存被正确清除。
  • 线程安全:在多线程环境中,确保对共享资源的访问是线程安全的。
  • 重新认证:在某些情况下,你可能需要让用户重新登录以刷新其会话和权限信息。这取决于你的具体需求和实现。
  • 性能:频繁地刷新权限可能会影响性能。因此,请确保只在必要时刷新权限,并优化你的数据源访问和缓存策略。

通过以上步骤,你可以在Spring Boot Shiro项目中实现权限刷新功能。

如何更新ShiroFilter初始权限

在Shiro框架中,ShiroFilter是用于执行URL级别的访问控制的组件。一旦ShiroFilter被初始化,并且根据配置(如shiroFilterFactoryBean)设置了初始的权限规则,这些规则在运行时是静态的,即它们不会自动更新以反映用户权限的变化。

然而,有几种方法可以在运行时更新ShiroFilter的权限规则:

  1. 重新初始化ShiroFilter
    这种方法涉及到销毁当前的ShiroFilter实例,并根据新的权限规则重新创建一个。这通常不是推荐的做法,因为它涉及到复杂的上下文管理和可能的会话丢失。

  2. 使用动态代理或AOP
    可以通过动态代理或AOP(面向切面编程)来拦截对ShiroFilter的访问控制检查,并在检查之前动态地应用新的权限规则。这种方法需要深入理解Shiro的内部机制和Java的动态代理技术。

  3. 清除缓存并重新加载权限
    当用户的权限发生变化时,可以清除Shiro的缓存(特别是授权缓存),并触发Shiro重新加载用户的权限信息。这通常是通过调用Realm的doClearCache方法来实现的。然后,当Shiro需要再次检查权限时,它会从Realm中重新加载这些信息。

  4. 自定义Filter或Advice
    可以创建一个自定义的Shiro Filter或Spring AOP Advice,在每次访问控制检查之前检查权限是否已过期或需要刷新。如果需要,可以在此时从数据源重新加载权限并更新Shiro的上下文。

  5. 使用Shiro的WebSubject.checkPermission
    在控制器或服务层中,而不是依赖ShiroFilter的URL映射,可以显式地调用WebSubject.checkPermission来检查权限。这种方法更加灵活,因为它允许你在业务逻辑的任何地方进行权限检查,并可以根据需要动态地应用新的权限规则。

  6. 重新登录
    虽然这不是更新ShiroFilter权限的直接方法,但在某些情况下,让用户重新登录可能是最简单的解决方案。重新登录会触发一个新的会话创建,并根据最新的用户信息加载权限。

在实际应用中,最常用和推荐的方法是清除缓存并重新加载权限(方法3),以及使用自定义的权限检查逻辑(方法5)。这些方法既灵活又相对简单,能够很好地适应大多数权限动态变化的场景。

请注意,无论选择哪种方法,都需要确保在权限更新过程中系统的安全性和一致性。例如,在清除缓存之前,可能需要确保没有其他并发操作正在使用旧的权限信息。

相关文章:

SpringBoot+Shirp的权限管理

目录 怎么实现动态菜单 1.html页面 2.获取动态菜单 Shiro权限刷新 1. 配置Shiro 2. 创建权限刷新服务 3. 调用权限刷新服务 注意事项 如何更新ShiroFilter初始权限 怎么实现动态菜单 1.html页面 <ul class"nav side-menu"><!--第一重循环&#xf…...

OpenCV图像基础

目录 显示窗口 创建空白图像 保存图片 图像裁剪 调整图片大小 图像绘制 绘制圆形 绘制矩形 绘制直线 绘制文本 中文乱码 控制鼠标 视频处理 显示窗口 cv2.namedWindow(winname, flagsNone) 创建一个命名窗口&#xff0c;以便在该窗口中显示图像或进行其他图形操作…...

基于MATLAB的图像拼接技术

实验名称&#xff1a;基于MATLAB的图像拼接技术实验目的&#xff1a;利用图像拼接技术得到超宽视角的图像&#xff0c;用来虚拟实际场景。实验原理&#xff1a; 基于相位相关的图像拼接技术是一种基于频域的方法&#xff0c;通过求得图像在频域上是相位相关特点来找到特征位置…...

ComfyUI 快速入门(环境搭建)

ComfyUI 是一个现代化、灵活的用户界面&#xff08;UI&#xff09;工具&#xff0c;专为 AI 模型和深度学习框架设计&#xff0c;能够快速实现可视化操作和定制化界面。在本教程中&#xff0c;我们将介绍如何在本地机器上快速搭建 ComfyUI 环境&#xff0c;帮助你开始使用这一工…...

将HTML项目上传至Gitee仓库(详细教程)

1.登录giett giett地址链接:Gitee - 基于 Git 的代码托管和研发协作平台 2.新建一个giett仓库 创建后得到远程仓库&#xff1a; 3、在本地项目文件夹右击鼠标点击 Open Git Bash Here 4、输入命令 命令:git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出…...

如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?

引言 在数据管理和数据库设计中,数据去重是一个重要的课题。随着信息技术的快速发展,数据的产生速度和数量都在急剧增加,如何有效地管理和维护这些数据成为了一个亟待解决的问题。 数据去重不仅可以减少存储空间的占用,还可以提高数据查询的效率,确保数据的准确性和一致…...

论负载均衡技术在Web系统中的应用论文

一、概要叙述软件项目及其主要工作 在2023年&#xff0c;我有幸参与了某公司电子商务平台的研发项目&#xff0c;担任系统架构设计师一职。该项目旨在构建一个高性能、高可用性的电子商务平台&#xff0c;以支撑公司日益增长的在线业务需求。作为系统架构设计的核心成员&#…...

NumPy 数据类型

1.常用 NumPy 基本类型 &#xff08;1&#xff09;bool_&#xff1a;布尔型数据类型&#xff08;True 或者 False&#xff09; &#xff08;2&#xff09;int_&#xff1a;默认的整数类型&#xff08;类似C 语言long&#xff0c;int32 或 int64&#xff09; &#xff08;3&a…...

JavaScript——(4)

【DOM】 一、DOM基本概念 DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09;是 JavaScript 操作 HTML 文档的接口&#xff0c;使文档操作变得非常优雅、简便。 DOM 最大的特点就是将 HTML 文档表示为 “节点树”。 DOM 元素/节点&#xff1a;就是…...

每日一练 | DHCP Relay(DHCP 中继)

01 真题题目 DHCP Relay 又称为 DHCP 中继&#xff0c;下列关于 DHCP Relay 的说法正确的是&#xff08;多选&#xff09;&#xff1a; A. DHCP 协议多采用广播报文&#xff0c;如果出现多个子网则无法穿越&#xff0c;所以需要 DHCP Relay 设备。 B. DHCP Relay 一定是一台交…...

`psdparse`:解锁Photoshop PSD文件的Python密钥

文章目录 psdparse&#xff1a;解锁Photoshop PSD文件的Python密钥背景&#xff1a;为何选择psdparse&#xff1f;psdparse是什么&#xff1f;如何安装psdparse&#xff1f;简单函数使用方法应用场景常见Bug及解决方案总结 psdparse&#xff1a;解锁Photoshop PSD文件的Python密…...

考研要求掌握的C语言程度(插入排序)

插入排序是啥类型的排序 插入类型的 插入排序经常用在啥类型场景下 用在有序序列下的基础上插入新数据 时间复杂度分析 如果是有序的基础下&#xff0c;最好的时间复杂度是O&#xff08;n&#xff09;; 普通情况下是O&#xff08;n^2&#xff09; 插入排序的原理是啥&am…...

mybatis源码解析-sql执行流程

1 执行器的创建 1. SimpleExecutor 描述&#xff1a;最基本的执行器&#xff0c;每次查询都会创建新的语句对象&#xff0c;并且不会缓存任何结果。 特点&#xff1a; 每次查询都会创建新的 PreparedStatement 对象。 不支持一级缓存。 适用于简单的查询操作&#xff0c;不…...

Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…...

【linux】HTTPS 协议原理

1. 了解 HTTPS 协议原理 &#xff08;一&#xff09;认识 HTTPS HTTPS 也是一种应用层协议&#xff0c;是在 HTTP 协议的基础上引入了一个加密层 因为 HTTP协议的内容都是按照文本的方式进行传输的&#xff0c;这个过程中&#xff0c;可能会出现一些篡改的情况 &#xff08;…...

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…...

数据安全-接口数据混合加密笔记

接口数据传输安全设计方案 采用非对称加密对称加密混合方式&#xff0c;接口混合加、解密过程梳理&#xff1a; 后端准备sm2公钥和私钥后端将SM2公钥传输到前端前端生成SM4密钥前端使用SM2公钥加密SM4秘钥&#xff0c;获得密文使用SM4秘钥加密数据将密文和加密数据传输至后端…...

JeecgBoot入门

最近在了解低代码平台&#xff0c;其中关注到gitee上开源项目JeecgBoot&#xff0c;JeecgBoot官方也有比较完整的入门教学文档&#xff0c;这里我们将耕者官方教程学习&#xff0c;并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…...

用 Vue.js 打造炫酷的动态数字画廊:展示学生作品的创意之旅

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【YOLO学习】YOLOv8改进举例

文章目录 1. ODConv1.1 修改1.2 原yaml文件1.3 修改yaml文件样式11.4 修改yaml文件样式2 2. DAT3. 在train下修改模型 1. ODConv 1.1 修改 1. 在ultralytics/nn/models里创建ODConv.py文件。 2. 在ultralytics/nn/task.py中导入from .modules.ODConv import C2f_ODConv,ODConv…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

宠物车载安全座椅市场报告:解读行业趋势与投资前景

一、什么是宠物车载安全座椅&#xff1f; 宠物车载安全座椅是一种专为宠物设计的车内固定装置&#xff0c;旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成&#xff0c;具备良好的缓冲性能&#xff0c;并可通过安全带或ISOFIX接口固定于车内。 近年来&…...

npm install 相关命令

npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖&#xff08;默认&…...

安全领域新突破:可视化让隐患无处遁形

在安全领域&#xff0c;隐患就像暗处的 “幽灵”&#xff0c;随时可能引发严重事故。传统安全排查手段&#xff0c;常常难以将它们一网打尽。你是否好奇&#xff0c;究竟是什么神奇力量&#xff0c;能让这些潜藏的隐患无所遁形&#xff1f;没错&#xff0c;就是可视化技术。它如…...