Shiro权限刷新

一、权限刷新的需求背景

在实际应用中,用户的权限可能会因为多种原因而发生变化,如用户角色的调整、权限的授予或撤销等。如果系统不能及时地反映这些变化,就可能导致安全漏洞或功能受限。因此,Shiro框架提供了权限刷新的机制,以确保系统的安全性和功能的完整性。

二、权限刷新的实现方式

  1. 通过重新加载权限配置

    • Shiro允许开发者在权限配置发生变化时,重新加载权限配置。这通常涉及到修改权限配置文件或数据库中的权限信息,并调用Shiro框架提供的API来重新加载这些配置。
    • 例如,在Shiro的Spring Boot集成中,可以通过调用ShiroFilterFactoryBeansetFilterChainDefinitionMap方法来重新设置权限过滤链。
  2. 通过清除缓存

    • Shiro在认证和授权过程中会使用缓存来提高性能。然而,当用户权限发生变化时,这些缓存信息可能会变得过时。
    • 因此,Shiro提供了清除缓存的机制。开发者可以在修改用户权限后,调用Shiro的API来清除相关的认证和授权缓存,从而确保权限刷新的有效性。
    • 例如,在自定义的Realm中,可以通过调用getAuthenticationCache().removegetAuthorizationCache().remove方法来清除特定用户的认证和授权缓存。
  3. 通过动态构建权限过滤器

    • Shiro支持动态构建权限过滤器,这意味着开发者可以在运行时根据用户的权限信息来构建过滤器链。
    • 当用户权限发生变化时,可以重新构建过滤器链以反映这些变化。
    • 这通常涉及到获取当前的权限信息、构建新的过滤器链,并将其应用到Shiro的过滤器管理器中。

三、权限刷新的注意事项

  1. 同步性

    • 在多用户并发访问的场景下,需要确保权限刷新的同步性,以避免因权限信息不一致而导致的安全问题。
  2. 性能

    • 频繁的权限刷新可能会对系统性能产生影响。因此,需要在确保安全性的前提下,合理地控制权限刷新的频率。
  3. 异常处理

    • 在权限刷新过程中,可能会遇到各种异常情况,如数据库连接失败、配置文件解析错误等。因此,需要做好异常处理,确保系统的稳定性和可用性。

MyShiroRealm

// 清空 当前认证用户权限缓存public void clearMyCachedAuthorizationInfo(){clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals());}// 清空所有用户权限缓存public void clearAllCacheAuthorizationInfo(){if (this.isAuthorizationCachingEnabled()){// 权限缓存是否可用Cache<Object, AuthorizationInfo> cache = null;CacheManager cacheManager = this.getCacheManager();if (cacheManager != null){String cacheName = this.getAuthorizationCacheName();// 获得权限缓存cache = cacheManager.getCache(cacheName);// 获得权限缓存}if (cache != null){cache.clear();// 清空}}}

权限刷新方法

public Map loadFilterChainDefinitions() {Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();// 必须使用LinkedHashMap(有序集合)filterChainDefinitionMap.put("/css/**","anon");filterChainDefinitionMap.put("/fonts/**","anon");filterChainDefinitionMap.put("/images/**","anon");filterChainDefinitionMap.put("/js/**","anon");filterChainDefinitionMap.put("/localcss/**","anon");filterChainDefinitionMap.put("/localjs/**","anon");filterChainDefinitionMap.put("/login","anon");filterChainDefinitionMap.put("/logout","logout");// 注销过滤器,自动注销// 配置需要特点权限才能访问的资源(URL)// 动态授权List<SRight> rights = roleMapper.findAllRights();for (SRight right : rights) {if (right.getRightUrl() != null && !right.getRightUrl().trim().equals("")){filterChainDefinitionMap.put(right.getRightUrl(),"perms[" + right.getRightCode() + "]");System.out.println("动态授权:" + right.getRightText());}}// 配置认证访问:其他资源(URL)必须认证通过才能访问filterChainDefinitionMap.put("/**","authc");// 必须放在过滤器链的最后面return filterChainDefinitionMap;}public void reloadFilterChainDefinitions() {try {HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();ServletContext servletContext = request.getSession().getServletContext();AbstractShiroFilter shiroFilter = (AbstractShiroFilter) WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean("shiroFilterFactory");synchronized (shiroFilter){// 获取过滤管理器PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter.getFilterChainResolver();DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver.getFilterChainManager();// 清空初始权限权限manager.getFilterChains().clear();// 重新加载动态权限,配置权限验证规则Map<String, String> chains = loadFilterChainDefinitions();// System.out.println("chains--------" + chains);for (Map.Entry<String, String> entry : chains.entrySet()) {String url = entry.getKey();String chainDefinition =  entry.getValue().trim().replace("","");manager.createChain(url, chainDefinition);}System.out.println("更新权限成功!!");}}catch (Exception e){e.printStackTrace();}}

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

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

相关文章

sqlserver循环的学习

最近在测试项目功能时&#xff0c;需要生成一些随机的问题总数、改善数、改善率的数据&#xff0c;因此需要用到SqlServer的循环&#xff0c;在这里记录一下。下面以随机生成十条数据为例&#xff0c;表结构如下: CREATE TABLE re_class(guid NVARCHAR(50) primary key,totalC…

ElementUI<el-table></el-table>表格中固定列横向滚动条无法拖动解决

当表格有固定列会出现横向滚动条无法拖动问题&#xff0c;尤其是固定列固定在左边且表格没数据的时候。这可能是因为固定区域盖住了横向滚动条&#xff0c;不是视觉上的覆盖&#xff0c;是去拖动时没有触发效果。 解决方法如下&#xff1a; 1.修改层级 使用z-index&#xff0…

ctfshow web系列

声明: 本文章只适用于网络安全交流与学习,请读者遵循网络安全法,若读者从事一些与网络安全不相关的事情&#xff0c;结果均与本人无关&#xff01;&#xff01;&#xff01; 是ctfshow的web题:https://www.ctf.show/ web3: 开局提示使用php include get url include()函数是…

善用Git LFS来降低模型文件对磁盘的占用

将讲一个实际的例子&#xff1a;对于模型文件&#xff0c;动辄就是好几个G&#xff0c;而有的仓库更是高达几十G&#xff0c;拉一个仓库到本地&#xff0c;稍不注意直接磁盘拉满都有可能。 比如&#xff1a;meta-llama-3.1-8b-instruct&#xff0c;拉到本地后发现居然占用了60G…

十四届蓝桥杯STEMA考试Python真题试卷第二套第五题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第五题 本题属于迷宫类问题,适合用DFS算法解决,解析中给出了Python中 map() 和列表推导式的应用技巧。最后介绍了DFS算法的两种常见实现方式——递归实现、栈实现,应用场景——迷宫类问题、图的连通性、树的遍历、拓朴排…

MYSQL安装(ubuntu系统)

rpm -qa 查询安装软件包 ps axj 查询服务 卸载mysql&#xff08;万不得已&#xff09; ps axj | grep mysql 查看是否存在mysql服务 systemctl stop mysqld 关闭该服务 rpm -qa | grep mysql 查安装mysql安装包 rmp -qa | grep mysql | xargs (yum apt) -y remove进行批量…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级的过程&#xff0c;遇到的问题和解决方案。 一、需求出发点 智能提醒小程序 当前使用的是jdk8&#xff0c;springboot2.3,升级到jdk21和springboot3.3 学…

MMdetection3D环境配置

为啥要写这个&#xff1f;&#xff1a;没看网上有这个全的环境配置教程T^T 首先说明一下&#xff0c;由于mmdetection3d官方文档说支持Linux平台&#xff0c;实验性支持windows&#xff0c;所以我们选择Linux平台进行开发 0.Linux双系统安装 参考这个视频即可 Windows 和 U…

openapi回调地址请求不通过

目录 1. 验证url接口get请求本地自测报错 2. 测试回调模式成功不返回结果 3. 测试回调模式返回结果带双引号 对接企业微信 产生会话回调事件 接口问题解决 1. 验证url接口get请求本地自测报错 java.lang.IllegalArgumentException: Last encoded character (before the pa…

Chrome和夸克谁更护眼

在当今数字化时代&#xff0c;我们每天长时间面对电脑和手机屏幕&#xff0c;眼睛的健康问题变得越来越重要。浏览器作为我们日常使用频率极高的工具&#xff0c;其护眼功能的优劣直接影响到我们的视觉舒适度。本文将对Chrome和夸克两款主流浏览器进行对比&#xff0c;探讨它们…

命令行参数、环境变量、地址空间

命令行参数&#xff1a; int main(int argc, char *argv[ ])&#xff0c;main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。 在linux中会把输入的字符串存到char *argv[ ]中&#xff0c;在数组的结尾为NULL。 命令行参数可以让同一个程序可以通过不同…

基于Matlab 模拟停车位管理系统【源码 GUI】

系统对进入停车位的车辆进行车牌识别&#xff0c;将识别出来的车牌号显示出来&#xff1b;然后对车主进行人脸识别&#xff0c;框出车主照片的人脸部分作为车主信息的标记&#xff0c;记录在系统库中。车辆在库期间&#xff0c;系统使用者可以随意查看车辆与车主信息的获取过程…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

SpringBoot开箱即用

点开SpringBoot项目POM文件中父依赖,按住Ctrl+鼠标左键,点进去 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/&…

学习笔记:微服务技术栈(一)服务治理框架SpringCloud

教学视频链接&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 目录 前言一、认识微服务1.1 服务架构1.2 微服务架构1.3 SpringCloud 二、服务拆分及远程调用2.1 服务拆分细节2.2 服务间调用 …

Centos 下安装 jsoncpp 库、bundle 数据压缩库、httplib 库 -- 详细教程

一、安装 jsoncpp 库 sudo yum install epel-release sudo yum install jsoncpp-devel [xyllocalhost ~]$ ls /usr/include/jsoncpp/json/ assertions.h config.h forwards.h reader.h version.h autolink.h features.h json.h value.h writer.h 注意&#xff1a;Centos 版本不…

前端小练习——星辰宇宙(JS没有上限!!!)

前言&#xff1a;在刚开始学习前端的时候&#xff0c;我们会学习到前端三件套中的JavaScript&#xff0c;可能那时候读者没有觉得JavaScript这个语言有多么的牛逼&#xff0c;本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

实时金融股票数据API接口websocket接入方法

一、使用websocket的协议提升传输速度 实时金融股票数据对于投资者和交易员来说至关重要。通过使用WebSocket接入方法&#xff0c;可以轻松获取实时金融股票类数据并及时做出决策。WebSocket是一种高效的双向通信协议&#xff0c;它允许数据的实时推送&#xff0c;避免了不断的…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…