通用权限管理设计 之数据权限

简介:

本文将对这种设计思想作进一步的扩展,介绍数据权限的设计方案。

权限控制可以理解,分为这几种 :

【功能权限】:能做什么的问题,如增加产品。
【数据权限】:能看到哪些数据的问题,如查看本人的所有订单。
【字段权限】:能看到哪些信息的问题,如供应商账户,看不到角色、 部门等信息。

上面提到的那种设计就是【功能权限】,这种设计有一定的局限性,对于主体,只能明确地指定。对于不明确的,在这里可能就没办法处理。比如下面这几种情况:

Java代码   收藏代码
  1. 数据仅当前部门及上级可见  
  2. 数据仅当前用户(本人)可见  

类似这样的就需要用到上面提的数据权限。

上一篇文章我用一个表五个字段完成了【功能权限】的设计思路
本文我将介绍如何利用一个表两个字段完成这个【数据权限】的设计思路

初步分析

【数据权限】是在【功能权限】的基础上面进一步的扩展,比如可以查看订单属于【功能权限】的范围,但是可以查看哪些订单就是【数据权限】的工作了。

Java代码   收藏代码
  1. 在设计中,我们规定好如果没有设置了数据权限规则,那么视为允许查看全部的数据。  
  2.   
  3. 几个概念  
  4. 【资源】:数据权限的控制对象,业务系统中的各种资源。比如订单单据、销售单等。属于上面提到的【领域】中的一种  
  5. 【主体】:用户、部门、角色等。  
  6. 【条件规则】:用于检索数据的条件定义  
  7. 【数据规则】:用于【数据权限】的条件规则   

应用场景
1,订单,可以由本人查看 
2,销售单,可以由本人或上级领导查看 
3,销售单,销售人员可以查看自己的,销售经理只查看 销售金额大于100,000的。

我们能想到直接的方法,在访问数据的入口加入SQL Where条件来实现,组织sql语句:

Java代码   收藏代码
  1. where UserID = {CurrentUserID}  
  2. where UserID = {CurrentUserID}  or {CurrentUserID} in (领导)  
  3. where UserID = {CurrentUserID}  or ({CurrentUserID} in (销售经理)  and 销售金额 > 100000)  
Java代码   收藏代码
  1. 这些一个一个的"条件",本文简单理解为一个【数据规则】,通常会与原来我们前台的业务过滤条件合并再检索出数据。  

这是一种最直接的实现方式,在【资源】上面加一个【数据规则】(比如上面的三点)。这样设计就是

  【资源】 - 【数据规则】

我又觉得不同的人应该对应不同的规则,那么也可以理解为,一个用户对应不同的角色,每一个角色有不一样的【数据规则】,那么设计就变成

  【资源】 - 【主体】 - 【数据规则】

根据提供者的不同,准备不同的权限应对策略。

这里可以简单地介绍一下,这个方案至少需要2张表,一个是  【资源,主体,规则关系表】、一个是【数据规则表】

Java代码   收藏代码
  1. 关系表不能直接保存角色,因为你不确定什么时候业务需要按照【部门】或者【分公司】来定义数据规则  
  2. 于是可以用  Master、MasterKey  类似这样的两个字段来确定一个【主体】  

当然,上面是用SQL的方式来确定条件规则的,我们当然不会这么做。SQL虽然灵活,但是我们很难去维护,也不知道SQL在我们的界面UI上面如何体现。难不成直接用一个文本框来显示。这样对应一个开发人员来说不是问题,可是对应系统管理员,很容易出问题。所以我们需要有另一方式来确定这一规则,并最终可以转换成我们的SQL语句。

我们的设计关键在于如何规范好这些【数据规则】 ,这个规则必须是对前端友好的,而且是对后台友好的,JSON显然是很好的方式。

Java代码   收藏代码
  1. 规则说明:  
  2. 1,数据权限规则总是:{属性 条件 允许值}  
  3. 2,数据权限规则可以合并。比如 ( {当前用户 属于 销售人员} and {订单销售员 等于  当前用户} )   Or {当前用户  属于 销售经理}  
  4. 3,最终我们会用JSON格式  
  在检索数据时会先判断有没有注册了某某【资源】的【条件规则】,如果有,那么加载这个【条件规则】并合并到我们前台的【搜索条件】(你的业务界面应该有一个搜索框吧)  如下图定义了客户信息的搜索框,我们搜索客户ID包括AN,我们组织成的规则将会是:
Java代码   收藏代码
  1. {"rules":[{"field":"CustomerID","op":"like","value":"AN","type":"string"}],"op":"and"}  

 为了更好地理解【数据规则】,这里介绍一下【通用查询机制】 

【通用查询机制】

权限控制总离不开一些条件的限制(比如查看当前部门的单据),如果没有完善的通用查询规则机制,那么在做权限条件过滤的时候你会觉得很别扭。这里介绍一个通用查询方案,然后再介绍如何实现【数据规则】。

Java代码   收藏代码
  1. {"rules":  
  2. [  
  3. {"field":"OrderDate","op":"less","value":"2012-01-01"},  
  4. {"field":"CustomerID","op":"equal","value":"VINET"}  
  5. ]  
  6. ,"op":"and"}  
Java代码   收藏代码
  1. 规则描述:  
  2. 查找顾客VINET所有订单时间小于2011-01-01的单据  
这样的数据是安全的,而且是通用的(你甚至可以再加一个OR子查询)。无论是在前端还是后台,无论你使用什么样的组件,都可以很好地利用。

通用后台的翻译,就可以生成这样SQL的参数:

Java代码   收藏代码
  1. Text:  
  2. ([OrderDate] < @p1 and [CustomerID] = @p2)  
  3. Parameters:  
  4. p1:2012-01-01  
  5. p2:VINET  

 下面来点复杂的:查找 顾客VINET或者TOMSP,所有订单时间小于2011-01-01的单据

Java代码   收藏代码
  1. {  
  2. "rules":[{"field":"OrderDate","op":"less","value":"2012-01-01"}],  
  3. "groups":[  
  4. {"rules":[{"field":"CustomerID","op":"equal","value":"VINET"}, {"field":"CustomerID","op":"equal","value":"TOMSP"}],"op":"or"}  
  5. ],  
  6. "op":"and"  
  7. }  

  翻译结果:

Java代码   收藏代码
  1. Text:([OrderDate] < @p1 and ([CustomerID] = @p2 or [CustomerID] = @p3))  
  2. Parameters:  
  3. p1:2012-01-01  
  4. p2:VINET  
  5. p3:TOMSP  

这个过滤规则分为三个部分:【分组】、【规则】(字段、值、操作符)、【操作符】(and or),而自身就是一个分组。
这种简单的结构就可以满足全部的情况。

当然,上面提到的这些条件都是在前台定义(可能是用户在搜索框自己输入的)的,而 在后台,我们可能会定义一下【隐藏条件】,比如说 【员工只能查看自己的】,要怎么做呢,其实很简单,只需要在后台接收到这个过滤条件(前台toJSON,后台解析JSON)以后,再加上一个过滤规则(隐藏条件):

Java代码   收藏代码
  1. {field:'EmployeeID',op:'equal',value:5}  

 可以将原来的过滤规则当做一个分组加入进行:

Java代码   收藏代码
  1. {op:'and',groups:[  
  2.   
  3. {"rules":[{"field":"OrderDate","op":"less","value":"2012-01-01"}],  
  4. "groups":[  
  5. {"rules":[{"field":"CustomerID","op":"equal","value":"VINET"},{"field":"CustomerID","op":"equal","value":"TOMSP"}],"op":"or"}  
  6. ],"op":"and"}  
  7.   
  8. ],rules:[{field:'EmployeeID',op:'equal',value:5}]  
  9. }  

 翻译如下:

Java代码   收藏代码
  1. Text:  
  2. ([EmployeeID] = @p1 and ([OrderDate] < @p2 and ([CustomerID] = @p3 or [CustomerID] = @p4)))  
  3. Parameters:  
  4. p1:5  
  5. p2:2012-01-01  
  6. p3:VINET  
  7. p4:TOMSP  

这样的【条件规则】才是我们想要的,不仅在前端可以很好地解析,也可以在后台进行处理。在后台我们会定义跟这种数据结构对应的类,那么再定义一个翻译成SQL的类:

数据权限规则

说了这些,可以开始介绍如何实现【数据规则】了:

上面提到的【隐藏条件】,就是我介绍的【数据规则】
试想一些,这样 前台的过滤规则,再加上我们之间定义好的 【数据权限】控制 过滤条件。不就达到目的了吗。
先看看我们在数据库里保存的这些【数据规则】:

看不明白?那来个清楚一点的: 

 下图是我们设计【数据权限】的界面,可以选择所有的字段,包括几个用户信息:

 

如果说数据权限是对功能权限在纵向的扩展,那么字段权限就是在横向的扩展。可以禁止指定用户/角色 对某些字段的访问

举个例子:我有个员工表,B用户能查询5条记录,但看不见记录中工资字段里的数据,C用户也能查询5条记录,但能看到记录中工资字段里的数据,因为C用户是财务部门的人。
本文提出了数据权限的一种实现思路,只是本人在做一个web应用时构思的方案,谈不上规范,欢迎提出你的建议意见。

可以在http://case.ligerui.com体验实际的应用效果。

相关文章
|
SQL JSON 数据可视化
权限开发手册,数据权限和接口权限配置
权限开发手册,数据权限和接口权限配置
2362 0
权限开发手册,数据权限和接口权限配置
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
171545 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
4月前
|
安全 数据可视化 决策智能
OpenClaw 多 Agent 配置实战指南
本文详解OpenClaw多Agent配置实战:从创建工作区、绑定Discord频道,到沙箱隔离与工具权限控制(allow/deny优先级),涵盖配置结构、核心命令及常见坑点,助开发者快速搭建分工明确、安全可控的多智能体系统。
7457 4
OpenClaw 多 Agent 配置实战指南
|
12月前
|
XML 人工智能 Java
Spring Boot集成Aviator实现参数校验
Aviator是一个高性能、轻量级的Java表达式求值引擎,适用于动态表达式计算。其特点包括支持多种运算符、函数调用、正则匹配、自动类型转换及嵌套变量访问,性能优异且依赖小。适用于规则引擎、公式计算和动态脚本控制等场景。本文介绍了如何结合Aviator与AOP实现参数校验,并附有代码示例和仓库链接。
712 0
|
10月前
|
数据采集 Web App开发 人工智能
如何让AI“看懂”网页?拆解 Browser-Use 的三大核心技术模块
Browser-Use 是一种基于大语言模型(LLM)的浏览器自动化技术,通过融合视觉理解、DOM解析和动作预测等模块,实现对复杂网页任务的自主操作。它突破了传统固定选择器和流程编排的限制,具备任务规划与语义理解能力,可完成注册、比价、填报等多步骤操作。其核心功能包括视觉与HTML融合解析、多标签管理、元素追踪、自定义动作、自纠错机制,并支持任意LLM模型。Browser-Use标志着浏览器自动化从“规则驱动”向“认知驱动”的跃迁,大幅降低维护成本,提升复杂任务的处理效率与适应性。
4787 29
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
14510 33
MCP客户端调用看这一篇就够了(Java版)
|
SQL 关系型数据库 MySQL
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
Apache Flink CDC 3.4.0 版本正式发布!经过4个月的开发,此版本强化了对高频表结构变更的支持,新增 batch 执行模式和 Apache Iceberg Sink 连接器,可将数据库数据全增量实时写入 Iceberg 数据湖。51位贡献者完成了259次代码提交,优化了 MySQL、MongoDB 等连接器,并修复多个缺陷。未来 3.5 版本将聚焦脏数据处理、数据限流等能力及 AI 生态对接。欢迎下载体验并提出反馈!
2046 1
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
|
存储 安全 API
权限设计种类【RBAC、ABAC】
权限设计种类【RBAC、ABAC】
3289 2
|
人工智能 API 开发者
狂揽7.5k星!这款开源API网关彻底解放开发者:一键聚合GPT-4、Suno、Midjourney,还能在线充值!
New API 是一款基于 One API 二次开发的 AI 模型接口管理与分发系统,支持多种大模型(如 GPT-4、Suno、Midjourney 等)统一封装为 OpenAI 格式接口调用。其核心功能包括多模型统一网关、企业级权限管控、“推理力度”分级、无魔法访问全球 AI 服务、灵活计费体系及开发者友好设计。技术架构采用 Golang + Gin 框架,支持高并发低延迟,适用于企业内部 AI 中台、多模型 SaaS 平台、学术研究协作及个人开发者工具等场景。项目开源地址:https://github.com/kingbug/new-api。
11637 10
|
SQL JavaScript Java
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
本文介绍了如何在Spring Boot 3中整合MyBatis-Plus实现数据权限控制,通过使用MyBatis-Plus提供的`DataPermissionInterceptor`插件,在不破坏原有代码结构的基础上实现了细粒度的数据访问控制。文中详细描述了自定义注解`DataScope`的使用方法、`DataPermissionHandler`的具体实现逻辑,以及根据用户的不同角色和部门动态添加SQL片段来限制查询结果。此外,还展示了基于Spring Boot 3和Vue 3构建的前后端分离快速开发框架的实际应用案例,包括项目的核心功能模块如用户管理、角色管理等,并提供Gitee上的开源仓库
3570 11

热门文章

最新文章