框架模块说明 #05 权限管理_03

背景

权限设计可以分为两个主要方面:操作权限数据权限。前两篇文章已经详细介绍了操作权限的设计与实现,以及如何将其与菜单关联起来的具体方法。本篇将聚焦于数据权限,为您深入讲解相关的设计与实现方式。

全局开关

@Value("${system.DataDimension.open:false}")  // 全局开关,是否开通数据权限,默认为关闭
private Boolean isSystemDataDimensionOpen;

权限配置

配置数据权限时,可以配置两种类型的,一种是配置给角色,考虑到数据权限有可能是针对不同的用户的情况,所以也可以配置给指定用户,其实前面登录时讲过了登录时数据权限加载的一些内容,

数据字典

权限配置

角色数据权限

用户数据权限

表结构

CREATE TABLE `t_frame_data_dimension` (`data_auth_list_id` bigint NOT NULL AUTO_INCREMENT,`data_dimension_type` int NOT NULL COMMENT '10:角色 20:用户数据权限',`refer_id` bigint NOT NULL COMMENT '根据权限类型来关系不用的ID',`data_dimension` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '权限维度:: org(组织机构) /  micro 微服务',`data_dimension_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '权限值',`status` int NOT NULL DEFAULT '1' COMMENT '状态,1/有效 0/无效 -1/过期',`create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`create_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`data_auth_list_id`) USING BTREE,UNIQUE KEY `udx_t_frame_data_dimension` (`data_dimension_type`,`refer_id`,`data_dimension`,`data_dimension_value`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据权限列表\r\n角色类型为功能权限之外的权限统一为功能权限';

注解类

在实际的业务中并不是每个方法都要数据权限的控制,于是首先我增加一个方法级的注解,用来标注是否需要校验数据权限。但是这个注解是专门来处理mapper.xml自定义标签的处理,

权限标签

我们将自定义标签"dataDimension",如下为自定义标签的示例:

<where><![CDATA[1=1<dataDimension> [{"fieldName":"t_system_dic_master.belong_micro_service","dimensionName":"micro_service_name","operator":"="}] </dataDimension>]]><if test="params.dicMasterId!=null">dic_master_id = #{params.dicMasterId,jdbcType=BIGINT}</if><if test="params.dicCode!=null">and dic_Code like CONCAT('%',#{params.dicCode,jdbcType=VARCHAR},'%')</if><if test="params.dicName!=null">and dic_Name like CONCAT('%',#{params.dicName,jdbcType=VARCHAR},'%')</if><if test="params.status!=null and params.status!=''">and t_system_dic_master.`status` = #{params.status,jdbcType=INTEGER}</if><if test="params.belongMicroService!=null and params.belongMicroService!=''">and t_system_dic_master.belong_micro_service = #{params.belongMicroService,jdbcType=INTEGER}</if><if test="params.dicItemCode!=null or params.dicItemName!=null or params.dicItemValue!=null">and exists(select 1 from t_system_dic_item dic_itemwhere dic_item.dic_master_id = t_system_dic_master.dic_master_id<if test="params.dicItemCode!=null">and dic_item.dic_item_code like CONCAT('%',#{params.dicItemCode,jdbcType=VARCHAR},'%')</if><if test="params.dicItemName!=null">and dic_item.dic_item_name like CONCAT('%',#{params.dicItemName,jdbcType=VARCHAR},'%')</if><if test="params.dicItemValue!=null">and dic_item.dic_item_value like CONCAT('%',#{params.dicItemValue,jdbcType=VARCHAR},'%')</if>)</if></where>

Mybatis标签拦截器

由于代码量有点大,请稳步gitcode查看

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。icon-default.png?t=O83Ahttps://gitcode.com/YouYouLongLong/springcloud-framework/blob/master/core-common-parent/auth-common/src/main/java/org/cloud/dimension/mybatis/interceptor/DataDimensionInterceptor.java

UTIL类

由于现在一些类似于mybatisplus的框架大行其道,给mybatis的使用带来了很大的便利,当然同时也让程序员的sql脚本能力有所下降,基于这样的原因,那么业务中就要在java代码中控制数据权限了,我暂时没有想到好的办法,于是我提供DataDimensionUtil类进行数据权限的查询的功能,将数据权限获取后根据实际的业务需要进行处理。

public class DataDimensionUtil {private DataDimensionUtil() {}private final static DataDimensionUtil dataDimensionUtil = new DataDimensionUtil();public static DataDimensionUtil single() {return dataDimensionUtil;}private RedisUtil redisUtil;public RedisUtil getRedisUtil() {if (redisUtil == null) {redisUtil = SpringContextUtil.getBean(RedisUtil.class);}return redisUtil;}public Map<String, Set<String>> getCurrentUserAllDataDimension() {final Long userId = RequestContextManager.single().getRequestContext().getUser().getId();return getRedisUtil().hashGet(CoreConstant.USER_LOGIN_SUCCESS_CACHE_KEY + userId, USER_DIMENSION_CACHE_KEY);}public Set<String> getCurrentUserDataDimensionByName(String DataDimensionName) {return getCurrentUserAllDataDimension().get(DataDimensionName);}

总结

本文围绕数据权限的设计与实现展开,结合实际开发场景,从全局控制、权限配置、表结构设计、注解类定义、自定义标签、MyBatis标签拦截器以及实用工具类等多个方面进行了全面介绍,旨在为开发者提供完整的数据权限实现方案。

通过上述设计,数据权限实现方案具备以下特点:

  • 灵活性:支持多维度配置(角色、用户)与动态权限规则加载。
  • 可扩展性:结合 MyBatis 拦截器与工具类,便于扩展和适配多种业务需求。
  • 高效性:利用缓存优化权限查询性能,减少数据库查询压力。

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

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

相关文章

Linux网络编程之---多线程实现并发服务器

下面我们来使用tcp集合多线程实现并发服务器 一.服务端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>typedef struct sockinfo {char ip[16];unsigne…

Linux C/C++编程之静态库

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

uniapp实现加密Token并在每次请求前动态更新(vue、微信小程序、原生js也通用!)

导语&#xff1a;在Web开发中&#xff0c;Token作为一种身份验证的机制&#xff0c;被广泛应用于前后端交互过程中。本文将为大家介绍如何在每次请求前动态设置加密的Token&#xff0c;并在请求一次后使Token值加1&#xff08;或其他动态改变的逻辑&#xff09;&#xff0c;从而…

IDL学习笔记(二)IDL处理卫星数据

IDL处理卫星数据 HDF文件数据集属性通用属性 常用HDF4操作函数常用的HDF5操作函数读取HDF文件的一般步骤 HDF4文件读取-----数据信息查询HDF4文件读取示例-----目标数据TIFF输出 HDF文件 数据集属性 数据集名称&#xff0c;是“&#xff1a;”前的一部分&#xff0c;不是long_…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

TCP/IP协议簇自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 曾经&#xff0c;我只知道socket函数能进行网络间数据的通信&#xff0c;知道tcp/ip协议也是用来进行网络数据…

c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!

文章目录 前言一、c的第一个程序二、命名空间2.1 namespace 的价值2.2 namespace 的定义2.3 命名空间的使用 三、c的输入和输出四、缺省参数五、函数重载六、nullptr七、inline总结 前言 今天小编带着大家进入c的大门&#xff0c;虽然c难&#xff0c;但好事多磨&#xff0c;一起…

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试&#xff0c;于是配置并记录了一下&#xff1a; 首先运行ros接口的dm-vio&#xff0c;一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压&#xff0c;并安装一下依赖&#xff1a; sudo apt-get install …

基于Java Springboot成人教育APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer

【软考网工笔记】网络基础理论——传输层

IPSec协议 Internet协议安全性是一种开放标准的框架结构&#xff0c;通过使用加密的安全服务以确保在Internet协议&#xff08;IP&#xff09;网络上进行保密而安全的通讯。 工作在OSI模型的第三层网络层上&#xff0c;使其在单独使用时适于保护基于TCP或UDP的协议&#xff0…

Fastify装饰器:增强你的路由处理功能加入日志

Fastify以其出色的性能和扩展性脱颖而出。装饰器是Fastify提供的一个强大功能&#xff0c;它允许开发者在不修改核心代码的情况下&#xff0c;向请求&#xff08;Request&#xff09;和响应&#xff08;Response&#xff09;对象添加自定义属性和方法。本文将通过一个简单的示例…

redis命令行常用的操作及数据备份

redis命令行常用的操作及数据备份 1.连接命令行2.常用的命令3.数据备份恢复4.桌面管理工具 在日常工作中&#xff0c;有时候会需要去查看redis中某个缓存key是否存在、是否过期等情况&#xff1b;因此&#xff0c;记录整理了一些常用的命令&#xff1b; 1.连接命令行 连接到re…

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念&#xff1a; RDD&#xff1a; 弹性分布式数据集&#xff1b; DataFrame&#xff1a; DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

分布式集群下如何做到唯一序列号

优质博文&#xff1a;IT-BLOG-CN 分布式架构下&#xff0c;生成唯一序列号是设计系统常常会遇到的一个问题。例如&#xff0c;数据库使用分库分表的时候&#xff0c;当分成若干个sharding表后&#xff0c;如何能够快速拿到一个唯一序列号&#xff0c;是经常遇到的问题。实现思…

【算法刷题指南】优先级队列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

java基础概念46-数据结构1

一、引入 List集合的三种实现类使用了不同的数据结构&#xff01; 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点&#xff1a;先进后出&#xff0c;后进先出。 java内存容器&#xff1a; 3-2、队列 特点&#xff1a;先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…

第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]

第一部分&#xff1a;基础知识 3. 数据类型 --[MySQL轻松入门教程] MySQL 支持多种数据类型&#xff0c;这些数据类型可以分为几大类&#xff1a;数值类型、字符串类型、日期和时间类型、二进制类型以及枚举和集合。每种类型都有其特定的用途和存储需求。以下是 MySQL 中常用的…