java 项目通用数据权限设计

文章目录

  • 前言
  • 一、常见的数据权限
  • 二、通用数据权限设计思路
    • 通用权限示例(灵活配置最简单方式)
      • 两个表
      • 业务理解
      • 最终拼接出来的sql 为:
  • 总结


前言

权限一般分为操作权限和数据权限

操作权限: 菜单,页面,按钮
数据权限: 能看到的数据,包括各种页面的数据范围


一、常见的数据权限

例如:

  • 多租户,每个租户只能看到各自租户内部的数据

一般通过字段级别过滤,mybatis/mybatis-plus通常通过拦截器自动凭拼接或 手动拼接;

  • 单独配置某个特定的数据权限: 例如之前的项目,单独分配区域权限,这样每个人可以灵活看到区域数据,达到数据权限的配置;

一般是特定的数据权限,类似于用户级别的属性一样,每次查询用户 单独查询,类似于菜单权限数据一样; 这里推荐将此类数据权限放在 角色 上

  • 本文讲解,通用数据权限: 即类似于多租户的感觉,适用于所有表的过滤

与多租户不同的是,多租户的数据权限字段是固定的,不灵活,这里根据当前项目,分享两种灵活思路!

二、通用数据权限设计思路

  1. 通过类似枚举定义,在每个角色中,增加一个属性为数据范围, 分为各个等级; 其中等级的限制条件可以是各种维度的一种: 机构,区域,组织,然后类似于通过等级的不同,生成sql片段手动拼接到查询条件中;

例如: 当前组织以及子组织 (不是迭代)
sql片段为: org_code = 1 or org_code = 1-1
等级可以是: 当前组织; 子组织; 当前以及子组织; 当前以及迭代子集;当前组织的三级组织;等等

  1. 通过一种灵活的配置,达到不同字段的范围限制;

思路是通过exist / in 然后限制某个字段的值,这个字段是灵活的,可以自由配置,然后也是通过生成sql片段,手动拼接到查询中

通用权限示例(灵活配置最简单方式)

两个表

  • 普通业务表 category
  • 配置限制表 limit_table
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET latin1 */;USE `test`;/*Table structure for table `category` */DROP TABLE IF EXISTS `category`;CREATE TABLE `category` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',`pid` int(11) DEFAULT NULL COMMENT '父节点id',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;/*Data for the table `category` */insert  into `category`(`id`,`name`,`pid`) values 
(1,'文学',NULL),
(2,'童书',1),
(3,'社会科学',1),
(4,'经济学',1),
(5,'科普百科',2),
(7,'法律',3);/*Table structure for table `limit_table` */DROP TABLE IF EXISTS `limit_table`;CREATE TABLE `limit_table` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',`field` varchar(55) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '字段',`field_value` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '值',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='留言表';/*Data for the table `limit_table` */insert  into `limit_table`(`id`,`field`,`field_value`) values 
(1,'name','文学'),
(2,'name','童书'),
(3,'title','你好'),
(4,'title','不好');/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

业务理解

我想通过限制表,限制业务表中的数据,具体是通过field中的name字段限制,限制条件在限制表的field_value中

最终拼接出来的sql 为:

SELECT c.* FROM category c WHERE EXISTS (SELECT 1 FROM limit_table b WHERE b.field = ‘name’ AND b.field_value = c.name)

sql过滤结果

只有调用的人才知道具体要用哪个字段,限定哪张表,所以应该用哪个字段,以及用哪个表的哪个属性限制,需要调用的人传入;例如本示例中, b.field = ‘name’ 中的 name 和 b.field_value = c.name 中的 c.name 为调用方传入的一对对应关系!!


这里最牛的思路我认为有两个:

  1. 通过exists 的特性加速查询,还是通过特性,达到了b.field_value = c.name 过滤效果
  2. 通过灵活的配置,以及传入参数实现了数据权限sql片段生成的灵活性

总结

这里不做扩展,其实这里仅仅是最简单的方式,即直接通过限制表达到对于业务表的数据过滤,那么其实我们还可以通过其他方式限制;
例如:

  • 通过字典组限制,那么exists内部在拼接之前可能需要二次处理;
  • 通过sql语句配置限定条件,那么我们需要拼接sql语句,甚至当sql语句中有变量,我们需要解析后,再拼接到sql片段中;
  • 通过多个条件的限制,这里是单一条件,那么我可能有多个条件,这时候,这样的单表就无法满足了,我们需要创建更多的配置表,达到条件的配置以及组合( and / or 等),设置包括字典组和sql解析,然后最终形成一个复杂的sql片段;

单个条件组内的sql 需要 unin all
多个条件默认为 or

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

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

相关文章

python表白代码

以下是一个简单的示例: python def表白(对方): print("亲爱的" str(对方) ",") print("我喜欢你很久了。") print("你是如此美丽,聪明,迷人,让我无法自拔地爱上你。") prin…

AIGC行业现在适合进入吗

一、引言 随着人工智能技术的飞速发展,AIGC(人工智能生成内容)行业正逐渐成为科技领域的新热点。AIGC通过利用人工智能技术,自动生成文本、图像、音频、视频等多种形式的内容,极大地提高了内容生产的效率和质量。然而…

智能文档处理:解析文档场景下多模态大模型的应用与研究前沿

解析文档场景下多模态大模型的应用与研究前沿 一、TextIn 文档解析技术1. 现有大模型文档解析问题2. 文档解析技术背景3. TextIn 文档解析技术架构4. 版面分析关键技术 Layout-engine 二、TextIn 文本向量化技术三、TextIn.com Text Intelligence 一、TextIn 文档解析技术 hell…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.poll初始 poll也是一种linux…

【论文阅读 | 三维重建】3D Gaussian Splatting for Real-Time Radiance Field Rendering(3DGS)

Abstract 辐射场方法最近彻底改变了用多张照片或视频捕获的新颖视图合成,然而实现高视觉质量仍然需要训练和渲染成本高昂的神经网络,而最近更快的方法不可避免地要牺牲速度来换取质量。对于无边界和完整的场景和1080P分辨率的渲染,目前没有任…

MIRO时,修改页签“采购订单参考”的数量时,金额不自动计算

MIRO 发票校验时,进入到如下界面,系统参考采购订单自动带出已经收货的金额和数量。 此时如果想要修改数量时,有些用户账号下,金额不自动计算,但是有些用户账号下,数量更改时,系统自动计算和建议…

从零开始详解OpenCV硬币检测

前言 在上一篇中我们介绍了车道线检测,在本篇中我们将使用类似的做法来实现对应硬币的检测。 详解 打开并转换成灰度图 img cv2.imread(coin.png) gray_image cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) plt.imshow(img)二值化 thresh, output cv2.threshold(…

精选合作伙伴:如何挑选最适合您小程序商城开发的软件公司

在选择一家合适的软件公司来协助您开发并运营小程序商城时,选择过程无疑是一项关键而复杂的任务。市场上的软件公司繁多,各具特色,那么,如何在这众多的选择中找到最适合您的合作伙伴呢?以下将从需求梳理、公司实力评估…

##20 实现图像风格迁移:使用PyTorch深入学习的艺术之旅

文章目录 前言项目概述准备阶段图像处理模型选择风格和内容特征提取风格迁移算法优化过程结果展示完整代码与实验项目结论参考文献 前言 图像风格迁移是一种使一幅图像呈现另一幅画作风格的技术,通过深度学习,我们能够捕捉到内容图像的结构信息和风格图…

【driver6】debugfs,性能优化,

文章目录 1.内核调试手段:debugfs.h中api建立目录/sys/kernel/debug2.性能优化:裸磁盘无法使用,一般都刷文件系统。驱动加上要考虑磁盘io,内存占用,cpu使用情况3.Valgrind内存泄漏排查案例:4.cpu瓶颈&#…

基于YOLOv5的道路裂缝检测,加入一种基于内容引导注意力(CGA)的混合融合提升2个多点

💡💡💡本文主要内容:详细介绍道路裂缝检测整个过程,从数据集到训练模型到结果可视化分析。 💡💡💡通过加入一种基于内容引导注意力(CGA)的混合融合提升检测性能, 特征融合创新 | 一…

CCF PTA 2022年11月C++学生会提名

【问题描述】 学生会选举要开始了。根据选举规则,首先由全体同学进行提名,每位同学可以从全体同学中提 名一名同学参选。选举时,会从全体同学的提名中选出一名学生会主席,再从三个年级分别的提名中 各选出一名副主席。现在&#…