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)。这些方法既灵活又相对简单,能够很好地适应大多数权限动态变化的场景。

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

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

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

相关文章

hunyuan-DiT模型部署指南

一、介绍 Hunyuan-DiT是由腾讯混元推出的扩散模型&#xff0c;支持中文和英文双语输入&#xff0c;其他开源模型相比&#xff0c;Hunyuan-DiT 在中文到图像生成方面树立了新的水平。 二、部署流程 环境要求&#xff1a; 所需的最小 GPU 内存为 11GB&#xff0c; 建议使用具…

如何彻底删除gitbash中所有的命令记录、以及彻底删除Windows powerShell或者cmd中的所有命令记录

文章目录 1. 文章引言2. 彻底删除gitbash中所有的命令记录3. 彻底删除Windows powerShell或者cmd中的所有命令记录1. 文章引言 有时,我们使用外部电脑从gitbash中下载代码,假设使用history -c命令: 可以清除当前弹框的历史记录,但也无法彻底删除命令记录。打开gitbash后,通…

安全性测试

安全性测试评估系统在面对各种安全威胁时的防护能力和安全性的过程。以下是安全性测试的一些主要方面和方法&#xff1a; 1. 身份验证和授权测试 测试目标 确保系统能够正确验证用户的身份&#xff0c;并根据用户的权限授予相应的访问权限。测试方法 弱密码测试&#xff1a;尝…

利用 Feather 格式加速数据科学工作流:Pandas 中的最佳实践

利用 Feather 格式加速数据科学工作流&#xff1a;Pandas 中的最佳实践 在数据科学中&#xff0c;高效的数据存储和传输对于保持分析流程的流畅性至关重要。传统的 CSV 格式虽然通用&#xff0c;但在处理大规模数据集时速度较慢&#xff0c;特别是在反复读取和写入时。幸运的是…

Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录 零、写在前面一、水平拆分(sharding/分片)、故障转移(failover)机制介绍水平拆分&#xff08;Sharding&#xff09;故障转移机制 二、Redis的水平拆分的机制有关的配置1. 环境准备2. 配置文件配置3. 启动所有Redis实例4. 创建集群5. 测试集群读/写6. 集群管理 三、Red…

Linux SSH免密登入以及配置脚本

一、ssh原理简单介绍 客户端生成一对公钥和私钥&#xff0c;并将自己的公钥发送到服务器上 其中公钥用来加密&#xff0c;私钥用来解密。 二、ssh免密登入实现步骤详解 我这就以服务器controller和客户端compute来做为例子 2.1、首先在controller上输入ssh-keygen -t rsa …

什么是信息安全管理体系?

信息安全管理体系&#xff08;ISMS&#xff0c;Information Security Management System&#xff09;是组织在整体或特定范围内建立的信息安全方针和目标&#xff0c;以及完成这些目标所用的方法和手段所构成的体系。以下是对ISMS的详细解释&#xff1a; 一、定义与背景ISMS是信…

景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章

随着医疗科技快速进步与广泛应用&#xff0c;医疗信息的规模正在迅速扩张&#xff0c;如何有效管理这些医疗数据成为了关键议题。 医疗数据不仅包括传统的纸质病历&#xff0c;还有电子病历、实验室检测结果、医学影像等多样化的数字信息。为确保这些数据能为临床决策、科研分析…

Dockerfile文件编写

1、打nginx原始包 登录后复制 ROM nginxENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV TZ Asia/Singapore# 设置时区&#xff0c;同样保持在一层 RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \echo "${TZ}" > /etc/timezoneRUN apt-get …

react jsx基本语法,脚手架,父子传参,refs等详解

1&#xff0c;简介 1.1 概念 react是一个渲染html界面的一个js库&#xff0c;类似于vue&#xff0c;但是更加灵活&#xff0c;写法也比较像原生js&#xff0c;之前我们写出一个完成的是分为html&#xff0c;js&#xff0c;css&#xff0c;现在我们使用react库我们把html和js结…

物联网的智联项目是如何设计出来的?设计项目整个细节应该注意什么?

设计一个物联网的智联项目通常包括以下步骤&#xff1a; **一、需求分析** 1. 明确项目的目标和预期效果&#xff0c;例如是实现智能家居的自动化控制&#xff0c;还是工业设备的远程监测等。 2. 确定项目的应用场景和用户群体&#xff0c;了解他们的具体需求和使用习惯。 …

Android 字节飞书面经

Android 字节飞书面经 文章目录 Android 字节飞书面经一面二面 一面 1. 线程是进程的一部分&#xff0c;一个线程只能属于一个进程&#xff0c;而一个进程可以有多个线程&#xff0c;但至少有一个线程。 2. 根本区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;…

正则表达式-常用语法梳理

正则表达式-知识点 “ 在之前呢&#xff0c;我曾经因为工作需要&#xff0c;需要对一部分特定业务数据&#xff0c;提取数字部分&#xff0c;从而整理过一版正则表达式的基础知识 ” “ 最近&#xff0c;在做一些语音质检的规则配置&#xff0c;必不可免就需要用到正则表达式&a…

获取SKU详细信息API返回值说明

在电子商务平台中&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存量单位&#xff09;是用于追踪库存的唯一标识符。对于开发者来说&#xff0c;了解如何通过API获取SKU的详细信息是至关重要的。本文将详细介绍如何使用API获取SKU详细信息&#xff0c;并提供相应…

elastic search查找字段的方法

一,比如:elastic search 查找id为“ien9292voewew”的方法 此id为主键id,意思就是唯一id,在ES中是_id, 在 Elasticsearch 中,如果你想要查找特定 ID 的文档,可以使用 _get API。以下是如何通过 RESTful 请求或使用 Python 客户端来查找 ID 为 ien9292voewew 的文档的方…

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese&#xff0c;可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

[spring源码]spring推断构造方法

前言 Spring中的一个bean&#xff0c;需要实例化得到一个对象&#xff0c;而实例化就需要用到构造方法。 一般情况下&#xff0c;一个类只有一个构造方法&#xff1a; 要么是无参的构造方法要么是有参的构造方法 如果只有一个无参的构造方法&#xff0c;那么实例化就只能使…

Mysql 5.7 grant 授权异常

一、Mysql 问题描述 1.检查 mysql.table_priv 表&#xff0c;查看表的所属 select * from mysql.table_priv where table_name‘’; 2.检查 mysql.user 表&#xff0c;查看用于与白名单 select * from mysql.user; 3.查看 授权用户的权限 show grants for user_name; 4.查看 被…

【Sublime Text】格式化Json和XML

无package control解决方案 删除文件中的package control这一行并保存 下载 下载中

【CSS】——基础入门常见操作

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;CSS引入 二&#xff1a;CSS对元素进行美化 1&#xff1a;style修饰 2&#xff1a;选…