【面试】如何设计SaaS产品的数据权限?
文章目录
- 前言
- 数据权限是什么?
- 设计原则
- 整体方案
- RBAC模型
- 怎么控制数据权限?
- 1. 数据范围权限控制
- 2. 业务对象操作权限控制
- 3. 业务对象字段权限控制
- 总结
前言
一套系统的权限可以分为两类,数据权限和功能权限,今天我们从以下几个点,细聊下如何设计数据权限。
数据权限是什么?
要从三个方面回答这个问题。
- 一是控制登录人访问的数据范围,不该看的不能看;
- 二是控制登录人操作数据的行为,不该管的不能管;
- 三是控制登录人能够查看的业务对象属性,敏感的属性要管控。
设计原则
数据权限的设计,理应遵循两个原则:安全性、灵活性
- 安全性是根本,在这一套数据权限体系下,一定能真正控制住所有数据的权限;
- 而灵活性就是不能“写死”,一个系统需要权限控制的数据往往很多,需要很强的灵活性,要不然很影响用户体验,对技术团队也够麻烦。
整体方案
- 新增一个菜单,专门用于系统的数据权限控制维护,可以按用户名+菜单+字段+内容来设计。
- 当然,如果是一整套系统包括了很多子系统,设计的时候需要把系统也加上。
- 需要注意菜单和字段一定要校验在系统中是否存在,要不然就白维护了。
- 用户在打开一个菜单,就会调用这个数据权限维护的信息,判断里面的字段,显示的内容就是这些字段维护的,如果没有查到,可以默认显示全部数据(因为用户可以进入菜单说明已经拥有菜单的查看功能权限)。
RBAC模型
-
RBAC是
Role-BasedAccess Control的英文缩写,意思是基于角色的访问控制。 -
RBAC事先会在系统中定义出不同的角色,不同的角色拥有不同的权限,一个角色实际上就是一组权限的集合。而系统的所有用户都会被分配到不同的角色中,一个用户可能拥有多个角色。使用RBAC可以极大地简化权限的管理。
-
RBAC模型还可以细分为RBAC0,RBAC1,RBAC2,RBAC3。这里我们不讨论他们之间的差异,感兴趣的同学可以自行研究,我们主要聚焦于常见的RBAC0模型上。
-
如下图就是一个经典RBAC0模型的数据库设计。

在RBAC模型下,系统只会验证用户A是否属于角色RoleX,而不会判断用户A是否能访问只属于用户B的数据DataB。这种问题我们称之为“水平权限管理问题”。
怎么控制数据权限?
我们来看看应该怎么来控制登录人的数据权限,这里可以分为数据范围权限控制、数据操作权限控制和业务对象字段权限控制。
1. 数据范围权限控制
B 端客户内部的业务对象通常来说会按管理层级划分管辖范围,比如我曾经做过的物业平台,他们会按小区(也叫物业项目)、片区、分公司、大区和总部五个层级来划分管辖范围。
这里的小区其实就是一个基础的授权业务对象,然后将多个小区集合起来会形成片区。同时,经营小区的会是具有法人资质的主体,即分公司。多个分公司又会按地理区域划分到不同的大区,最后到总部管辖全部的业务数据。这个时候,我们就需要支持从基础的业务对象到更大范围的数据授权。
比如下面几个场景:
- A 小区的物业项目经理授权 A 小区,他只能看到 A 小区的各类业务数据(报修、投诉、收费等等);
- B 片区的物业片区经理授权 B 片区,他能够看到 B 片区下的全部小区的各类业务数据,包括以后在 B 片区再新增的小区。
- C 公司的物业分公司总经理授权 C公司,他能够看到C 公司下的全部小区的各类业务数据,包括以后在C 公司再新增的小区。
- D 大区的物业大区经理授权D大区,他能够看到D 大区下的全部小区的各类业务数据,包括以后在 D大区下各个分公司新增的小区。
- 总部的集团领导可以看到全部的小区各类业务数据。
通常来说,不同层级的授权方式是互斥的,也就是一个人不能说既按小区级别授权又按片区级别授权。同时,同一个层级的,是支持授权多个的。
对于 B 端客户的外部业务对象,因为不存在管辖层级,往往是通过分配的方式进行。即将一个或多个业务对象分配给某类角色或某个员工,登录人只能看到分配给自己的业务对象。典型的就是 CRM 系统的客户公海资源,员工只能看到分配给自己的客户。
2. 业务对象操作权限控制
业务对象操作权限是指对业务对象以及业务对象属性能够进行的操作。典型的业务对象的操作就是新增、删除、编辑、查看、导出、改变业务对象状态(如市场线索转销售线索)等等。比方说,我们控制 A 员工只能查看客户信息,不能新增、编辑、删除和导出客户信息。
3. 业务对象字段权限控制
业务对象字段的颗粒度就更小一点,是针对某个类型的业务对象,约束登录人能查看、编辑或导出业务对象的哪些属性。业务对象属性在技术上对应的是数据表的字段。
举个例子,CRM 系统的“客户”这个业务对象,会有名称、地址、电话、级别、所属行业等等信息。我们就可以控制A 员工(或角色)只能查看客户名称、级别和所属行业,不允许查看地址和电话。
总结
总的来说,数据权限的授权分为三个方面,业务对象范围授权、业务对象操作授权和业务对象字段授权。
为了实现这三个方式的授权,我们在产品设计上需要支持业务对象范围的划分、业务对象操作的定义和业务对象字段的定义,如下图所示。之后,我们就可以配置某个角色或人员的数据权限了。

数据权限是SaaS产品必不可少的功能。企业的数据很多涉及敏感信息,包括商业机密信息等等,因此必须在产品规划之初就明确权限管控的颗粒度,以及按何种方式管理数据权限。
相关文章:
【面试】如何设计SaaS产品的数据权限?
文章目录 前言数据权限是什么?设计原则整体方案RBAC模型怎么控制数据权限?1. 数据范围权限控制2. 业务对象操作权限控制3. 业务对象字段权限控制 总结 前言 一套系统的权限可以分为两类,数据权限和功能权限,今天我们从以下几个点…...
ansible管理变量
ansible变量简介 变量用于存储值,便于重复使用,可以简化项目的创建和维护。 变量命令规则 ansible变量的名称必须以字母开头,平且只能包含字母、数字和下划线,不允许有其他特殊字符。 变量范围 全局范围:从命令行…...
一种轻量级日志采集解决方案
前言 目前各大公司生产部署很多都是采用的集群微服务的部署方式,如果让日志散落在各个主机上,查询起来会非常的困难,所以目前我了解到的都是采用的日志中心来统一收集管控日志,日志中心的实现方案大多基于ELK(即Elasticsearch、L…...
【源码】Spring Cloud Gateway 是在哪里匹配路由的?
我们知道,经过网关的业务请求会被路由到后端真实的业务服务上去,假如我们使用的是Spring Cloud Gateway,那么你知道Spring Cloud Gateway是在哪一步去匹配路由的吗? 源码之下无秘密,让我们一起从源码中寻找答案。 入…...
BAT批处理基本命令
什么是 BAT 批处理脚本语言? BAT 批处理脚本语言是 Windows 系统自带的一种脚本语言,主要用于批量处理文件、目录、注册表、系统设置等任务。使用 BAT 批处理脚本语言可以节省大量手动操作的时间和精力。 如何编写 BAT 批处理脚本? 使用记事本…...
Python数组仿射变换
文章目录 仿射变换坐标变换的逻辑scipy实现 仿射变换 前面提到的平移、旋转以及缩放,都可以通过一个变换矩阵来实现,以二维空间中的变换矩阵为例,记点的坐标向量为 ( x , y , 1 ) (x,y,1) (x,y,1),则平移矩阵可表示为 [ 1 0 T x …...
“==“和equals方法究竟有什么区别?
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作符。 如果一个变量指向的数据是对象类型的,那么,这时候…...
蓝桥杯15单片机--超声波模块
目录 一、超声波工作原理 二、超声波电路图 三、程序设计 1-设计思路 2-具体实现 四、程序源码 一、超声波工作原理 超声波时间差测距原理超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍…...
【学习笔记】ARC159
D - LIS 2 因为没有让你求方案数,所以还是比较好做的。 如果每一个连续段都退化成一个点,那么答案就是直接求 L I S LIS LIS。 否则,假设我们选了一些连续段把它们拼起来形成答案,显然我们有 r i 1 ≥ l i r_{i1}\ge l_i ri1…...
2023/4/16总结
图的存储 链式前向星 链式前向星和邻接表很相似,只是存储方式变成了数组。 链式前向星一般要用到一个结构体数组和一个一维数组,结构体数组edges中包括三个变量。结构体数组的大小一般由边的大小决定。 edges数组中的to代表的是某条边的终点v。w代表的是这条边的…...
【剑指offer】常用的数据增强的方法
系列文章目录 BN层详解 梯度消失和梯度爆炸 交叉熵损失函数 反向传播 1*1卷积的作用 文章目录 系列文章目录常用的数据增强的方法示例代码 常用的数据增强的方法 数据增强是指通过对原始数据进行一系列变换来生成更多的训练数据,从而提高模型的泛化能力。常用的数…...
/lib/lsb/init-functions文件解析
零、背景 在玩AppArmor的时候涉及到了/etc/init.d/apparmor(无论是sudo /etc/init.d/apparmor start还是sudo systemctl start apparmor.service),而这个文件又涉及到了另一个文件、也就是本文的主角:/lib/lsb/init-functions。 …...
【ChatGPT】ChatGPT-5 强到什么地步?
Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 ChatGPT-5 强到什么地步? 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…...
[ARM+Linux] 基于全志h616外设开发笔记
修改用户密码 配置网络 nmcli dev wifi 命令扫描周围WIFI热点 nmcli dev wifi connect xxx password xxx 命令连接WiFi 查看ip地址的指令: ifconfig ip addr show wlan0 SSH登录 这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络…...
如何实现24小时客户服务
许多企业都有着这样的愿望:在不增加客服人员的同时能实现24小时客户服务。 那么有没有什么方法可以实现这一想法呢?在想解决方案之前我们可以先来谈谈客服的作用。 客服的作用主要为以下2点: 帮助用户更快地了解产品(减轻产品的…...
查询数据库空间(mysql和oracle)
Mysql版 1、查看所有数据库容量大小 -- 查看所有数据库容量大小 SELECTtable_schema AS 数据库,sum( table_rows ) AS 记录数,sum(TRUNCATE ( data_length / 1024 / 1024, 2 )) AS 数据容量(MB),sum(TRUNCATE ( index_length / 1024 / 1024, 2 )) AS 索引容量(MB) FROMinfor…...
为什么 SQLite 一定要用 C 语言来开发?
SQLite 是一种专门为在 Unix 和类 Unix 操作系统上运行的 Linux 服务器应用程序而设计的数据库管理系统,是一种轻量级的关系型数据库管理系统,它适用于许多嵌入式设备和物联网设备。它使用 C 语言编写,并且是一个开源项目。 简单易用&#x…...
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
原文:Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的…...
你的GPT跟ChatGPT可能只差了一个DPU
“人类永远不会嫌网络太快,就像永远不会嫌高铁太快,你只会嫌它慢,希望它更快些。” 一个月内,百度、阿里、腾讯、商汤、讯飞、360等国内大厂扎堆发布“中国版 GPT ”,这家的名字还没记清楚,另一家的又蹦了出…...
springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透
文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
