【面试】如何设计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 测试使用固定公网地址…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...