大型Saas系统的权限体系设计(二)

news2025/1/18 3:17:58

X0 上期回顾

上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题,即平台、平台的客户、客户的客户,乃至客户的客户的客户如何授权,这个可以通过“权限-角色-岗位”三级结构来实现。

但这个只是功能权限,如何在数据权限上进行区分和约束呢?比较极端的做法是在岗位设置上设定数据访问权限,但这会带来一个问题,即每个岗位几乎要等同于权限,需要拆分得很细,这会给管理员带来巨大的配置工作负担。所以比较巧妙的办法是把数据权限的控制拆分成宏观和微观,并且做解耦处理。

X1 行级数据权限控制

宏观数据权限控制,也可以称作行级数据权限控制,即管控到每一条数据记录的可访问范围。这个可以通过在“角色”这个实体上进行定义即可,即包括:

  1. 本人
  2. 本人即下属
  3. 本部门
  4. 指定个人
  5. 指定部门
  6. 全部

如果是“指定个人”和“指定部门”,只要设置具体的个人集合或者部门集合,即可限制该角色可访问的数据范围。

如果是对“本人及下属”,相对麻烦点。因为个人和个人之间的汇报关系比较难设定。而大型组织中常常会存在部门负责人和部门分管领导的管理结构,特别是OA审批中,经常会出现“发起人部门领导审批”和“发起人部门分管领导审批”这类设置,比较难以在组织结构和角色上进行实现。如果直接在用户基础上设立“直属上级”,又会带来另一个不好的结果,即如果领导调离会需要修改一大批下属的“直属上级”,一旦修改不及时就可能导致审批权限的混乱。

比较好的解决办法是把上下级关系建立在部门岗位基础上,由岗位形成上下级关系,而个人可以设定多个岗位,则人与人之间的上下级关系自然而然建立,同时又避免了因为上级岗位变动带来的不必要的大面积变更。

X2 列级数据权限控制

微观数据权限控制,也可以称作列级数据权限控制,即管控到每种业务数据的字段的可访问范围。这个控制相对比较复杂,成本也比较高。

如果建立在权限基础上,会导致权限需要拆分得很细。如果建立在角色基础上,又会对角色的大颗粒度造成破坏。而且,一旦把列级数据权限和行级数据权限纠结在一起,很容易形成渔网效应,失去应有的灵活性和适应性。

所以比较好的解决办法是把列级数据权限和行级数据权限解耦,即可以对列级数据权限单独管理,有需要做列级数据权限管理的业务数据才动态添加。而且列级数据权限控制最好控制到岗位这个级别。如下图:

X3 多租户的权限区隔

再回归到最初的议题,如果对于Saas系统,存在多租户,甚至租户有客户的情况下,如何对不同类型的客户的权限进行区隔?或者是否可以进行区隔,并且部分下放权限设置的权限呢?

答案是肯定的,而且必须下放。

设想下,一个成功的Saas系统,用户少则几万,多则千万,如果这么多的用户的权限管理都归于平台管理员一身,本身就是巨大的成本。所以下放权限管理功能是毋庸置疑的。但怎么下放呢?

  • 首先,权限这级应该是收归平台层管理的,角色这级部分也可以归平台层管理,主要是多数租户可以共用的角色。但租户和客户管理员,应该被授予角色创建的权限,这样才可能适应不同组织的特点设计不同的角色。
  • 其次,角色应该有权属的概念,即A租户创建的角色和B租户创建的角色是不可以共用的,A租户创建的角色原则上也不适用于A租户的客户。
  • 其次,对于权限应该设定适合的角色类型。这样各级管理员在创建用户角色时,将只能在限定的权限范围内去做角色的权限授权(很难想象,你客户的管理员可以在创建角色时看到你平台所有的菜单权限,OMG)。
  • 最后,光有权限和角色还不够,非常有必要增加“岗位”的概念。这个岗位虽然只对应一个角色,但同时需要明确所属部门(或组织),这样角色才可能得到最大程度的复用。现实生活中,不同部门的相同职位的管理人员既有相似的工作职能,也可能有不同的工作职能,所以光通过角色去设置可能导致不必要的冲突。

只要我们把角色、岗位之类的权限设置也看成一种数据,并且纳入数据权限控制的范畴,那么多租户的权限区隔就很容易实现了。

X4 结束语

近期也看到有一个开源的授权库模型 Casbin(一个支持如ACL, RBAC, ABAC等访问模型,可用于Golang, Java, C/C++, Node.js, Javascript, PHP, Laravel, Python, .NET (C#), Delphi, Rust, Ruby, Lua (OpenResty), Dart (Flutter)和Elixir的授权库。),国外应用极广。

结合以上拙文,供遇到相同问题并且在思考解决办法的同行参考。赠人玫瑰,手有余香,欢迎不吝赐教或者技术交流。

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

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

相关文章

mac免费杀毒软件哪个好用?如何清理mac系统需要垃圾

CleanMyMac x是一款功能强大的Mac系统优化清理工具,使用旨在帮助用户更加方便的清理您系统中的所有垃圾,从而加快电脑运行速度,保持最佳性能,更加稳定、流畅、快速!!! CleanMyMac X无疑是目前m…

C++内存管理基础

文章目录 前言1. C/C内存分布2. C语言中动态内存管理方式3. C中动态内存管理3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数(重点) 5. new和delete的实现原理5.1…

hana odata batch

sap 博客有写 odata batch 处理前,先看一张图 In this blog post,we are going to see how to send a Odata Batch Request to the SAP Cloud for Customer system using POSTMAN Tool. Answers to expect from this post? How to use batch request in the POS…

『python爬虫』04. 爬虫需要知道的HTTP协议知识(保姆级图文)

目录 1. HTTP协议是什么?2. HTTP协议结构3. 爬⾍需要的请求头和响应头内容总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. HTTP协议是什么? HTTP协议, Hyper Text Transfer Protocol…

2023独立站能不能做FP?看完这篇你就懂了

现在已经快2023年中了,2023年已经过去了1/3,但还是有人在问特货产品能不能做独立站,还是有不少人在观望。心动不如行动啊朋友们!要是想在跨境独立站做出一番事业来,建议现在立马行动起来,趁早在FP独立站领域…

工厂能耗管理系统linux嵌入式边缘网关

随着工业智能化进程的不断推进,能源能耗管理已成为企业经营中一个重要的环节。而在能源能耗管理场景下,边缘计算机发挥了越来越重要的角色。本文将介绍边缘计算机的功能特点、能源能耗使用对接的设备以及应用前景市场容量,并探讨ARM边缘计算机…

Java使用 Scanner连续输入int, String 异常错误输出原因分析

目录 一、Scanner常用语法 1、sc.nextInt()介绍 2、sc.next()介绍 3、sc.nextLine()介绍 4、sc.hasNext()介绍 二、报错案例 1、使用next()来接收带有空格的字符串会输出异常 2、先输入数字再输入字符串的输出异常 一、Scanner常用语法 Scanner sc new Scanner(System.…

STM32物联网实战开发(2)——回调函数

在第一篇博客中提到了全新的程序框架,我们会大量的使用回调函数,其中包括枚举类型、结构体、函数指针的应用。 回调函数:就是一个通过函数指针调用的函数。如果你把函数的地址传递给中间函数的形参,中间函数通过函数指针调用其所…

【VM服务管家】VM4.0软件使用_1.3全局模块类

目录 1.3.1 通讯管理:通讯管理的心跳管理功能的使用方法1.3.2 全局触发:使用全局触发功能执行流程的方法1.3.3 全局变量:全局变量关联流程中具体模块结果的方法1.3.4 全局脚本:方案加载完成信号发给通信设备的方法1.3.5 全局脚本&…

我做了个GPT3键盘,用了两个月发现它有点傻

自 ChatGPT 出世,各类文本类AI产品层出不穷。甚至接连几日,Producthunt 上新品过半都是AI相关。 这其中部分原因是 OpenAI 公司开放的 GPT3 1API 接口十分易用。只要一个简单的文本请求,就能将现有产品加入AI功能。例如,Notion、…

Docker在Windows系统中的安装方法和使用方法

Docker在Windows系统中的安装方法和使用方法 Docker是一种容器化技术,可以让开发者将应用程序和其依赖项打包成一个可移植的容器,从而实现快速部署和运行。在Windows系统中,Docker可以通过以下步骤进行安装和使用。 优点: Dock…

【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类

目录 3.3.1 位置修正:位置修正算子工具的使用方法3.3.2 模板保存:实现模板自动加载的方法3.3.3 模板匹配: 获取模板匹配框和轮廓点的方法3.3.4 模板训练:模板训练执行完成的判断方法3.3.5 图像相减:算子SDK开发图像相减…

浅谈软件质量与度量

本文从研发角度探讨下高质量软件应具备哪些特点,以及如何度量软件质量。 软件质量的分类 软件质量通常可以分为:内部质量和外部质量。 内部质量 内部质量是指软件的结构和代码质量,以及其是否适合维护、扩展和重构。它关注的是软件本身的…

数据结构 | 常见的数据结构是怎样的?

本文简单总结数据结构的概念及常见的数据结构种类 1’ 2。 更新:2023 / 04 / 05 数据结构 | 常见的数据结构是怎样的? 总览概念分类 常用的数据结构数组链表跳表栈队列树二叉树完全二叉树、满二叉树 平衡二叉树单旋转左旋右旋 红黑树红黑树 V.S 平衡二叉…

2 天:我用文字 AI-ChatGPT 写了绘画 AI-Stable Diffusion 跨平台绘画应用

文本 AI - ChatGPT 和绘画 AI - Stable Diffusion,平地惊雷,突然进入寻常百姓家。 如果时间可以快进,未来的人们对于我们这段时光的历史评价,大概会说: 当时的人们在短时间连续经历了这几种情感。从不信,…

java多线程BlockingDeque的三种线程安全正确退出方法

本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程,每个线程内逻辑时,判断BlockingDeque任务是否处理完,处理完退出,还有任务就BlockingDe…

对顶堆模板!!【DS对顶堆】ABC281 E - Least Elements

我想的思路和正解是差不多的 就是滑动窗口,每过去一个用DS维护一下前k个元素和sum 本来想的是用优先队列维护前k个 然后想着multiset维护前k个,但是具体不知道怎么操作 这里用的是multiset维护对顶堆 关于对顶堆,我在寒假的时候总结过 …

【Java笔试强训】(1)

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🦾🦾🦾 目录 一、选择题 二、编程题 🔥组队竞…

Github创建一个新仓库,关联本地数据并上传文件的图文步骤

工作中,我们经常会使用github来承享别人的代码果实,同时我们也会把自己的成果分享给别人,互相帮助。 今天的这篇图文教程非常重要,目标是使用Github来创建一个远程仓库,并和本地仓库对接,同时要做上传新内容…

初始Vue3【Vue3】

1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/releases/tag/v3.0.0 …