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

news/2025/1/22 8:40:59/

X0 概述

在2B系统开发中,权限体系设计是绕不开的问题。最简单的当然是RBAC模型,只要通过用户、角色、权限几个有限的概念,就可以建立起一套基本可用的权限体系。再复杂一点,可以增加角色的层级概念,使得角色的配置更高效。
但现实工作中,权限控制的需求往往更复杂,不仅涉及到功能授权,也涉及到数据授权,有些系统甚至涉及到更细的数据颗粒度授权,这个时候RBAC模型就显示出诸多的不足。
如何设计一套简单高效的权限体系,使得能够满足各种从简单到复杂的场景的应用,是产品经理和系统架构师需要用心的基础工作

X1 核心痛点

我公司一直想做一套Saas系统,目标是服务于智慧社区的管理,里面涉及到大量的组织、人、财、物、数据的管理,其中组织和人又需要分成多个层级,比如:

  1. 平台公司的组织结构
  2. 平台公司的租户管理
  3. 租户公司的组织结构
  4. 租户公司的客户管理
  5. 客户公司的组织结构
  6. 客户公司的员工管理

等等。

如何能够灵活地设置权限,让不同性质的用户在这个Saas平台上自如地处理业务,同时又严格地限制其数据访问范围,做到安全可控,是一个很大的挑战。

其次,还需要考虑常见的情况,比如:

  1. 一人多岗或者多职,比如分管领导兼任部门领导
  2. 多角色的跨越,比如即是员工又是用户
  3. 相同岗位不同管辖范围授权,比如多公司会计

等等。

还有更苛刻的要求,比如需要考虑不同的岗位对同一个数据拥有不同的访问权限,比如:

  1. 查询字段的限制
  2. 编辑字段的限制
  3. 下载字段的限制

等等。

以上需求都对传统的RBAC权限体系设计构成了巨大挑战。

X2 新权限体系模型

本着宁简勿烦的奥卡姆剃刀原则,对于以上复杂的权限管理需求,首先可以抽象出几个必要的概念。

A. 资源(Resource)

借鉴传统的LDAP产品,我们可以把每一个需要纳入管理的组织、人、财、物、数都看成是一种资源,当然每种资源的描述内容是千差万别的。

B. 资源类型(ResourceType)

不同的资源类型对应不同的元数据,可以有不同数量和类型的字段对其进行描述。不同资源类型之间相互可以有关联关系。

根据一般性的社会需要,可以大致分为:公司、部门、个人、设备(可以再细分)、地域(可以再细分)、小区等。原则上需要拥有单独的元数据描述的资源都需要定义为一种资源类型。

C. 资源详情(ResourceProfile)

如果需要去查看资源的具体的情况,就需要根据“资源类型+资源元数据”打开资源详情,在资源详情上面可以进行各种增删查改操作。

D. 资源目录(ResourceTree)

不同资源相互之间存在层级和依赖关系,并且每个资源只有唯一的父级资源,就构成了一颗自上而下的资源目录或者资源树。资源树是我们后期进行数据权限设置和控制的基础。

E. 权限(Privilidge)

权限比较简单,可以对应系统中某个菜单入口,或者某个操作按钮,或者某类资源的增删查改操作等。

F. 角色(Role)

角色跟RBAC一样,即是一组权限的组合。角色和角色之间可以形成层级关系。

一般而言,父级角色拥有比子级角色更大的权限,子级角色的权限则是父级角色权限的子集。

G. 岗位

对一个组织(公司或部门)可以设定多个岗位,每个岗位需要定义以下内容:

  1. 所属组织(公司或部门)
  2. 角色
  3. 资源类型
  4. 该资源类型可查看字段
  5. 该资源类型可编辑字段
  6. 该资源类型可下载字段
  7. 该资源类型的访问池(可以是资源目录中某些节点组合,也可以是具体的资源组合)

以上定义完整,即构成一个部门的一个岗位。

H. 用户

对用户而言,首要的是能够登录认证。只要在系统的资源目录中,并且账号密码验证通过即可访问该系统。

其次是用户操作具体业务和访问具体资源的授权检查,这个就需要通过给用户配置一个或多个岗位来实现。

当用户完成登录操作后,系统应该同步获取其拥有的岗位,并且能够在系统层级做不同岗位的切换。

X3 新权限体系关系图

X4 分级授权策略

回归到Saas系统,平台如何管理租户,租户如何管理客户,客户如何管理员工?这个就需要采取分而治之的策略。简单说就是,平台只负责为租户创建账号,然后限定其功能权限和数据权限,剩下的资源目录和权限体系由其自己去管理,租户对客户的管理也是如此。

但不同类型的管理员所能创建的岗位和访问的资源必然是受限的。

这就实现了一套复杂权限管理体系的架构设计。

后续如何具体形成数据库表和业务逻辑,请等待下级......


http://www.ppmy.cn/news/56950.html

相关文章

基于MATLAB实现WSN(无线传感器网络)的LEACH(低能耗自适应集群层次结构)(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 低能耗自适应集群层次结构(“LEACH”)是一种基于 TDMA 的 MAC 协议,它与无线传感器网络 &a…

JavaScript中的异步编程

当我们在编写JavaScript代码时,经常会遇到需要执行长时间运行的任务的情况,例如从服务器获取数据或进行复杂的计算。在这些情况下,我们不希望阻塞用户界面,因为这会使网站看起来卡顿,甚至无响应。为了避免这种情况&…

【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)

在对代码进行开源时,我们往往并不希望代码开发过程中的提交记录被其他人看到,因为提交的过程中往往会涵盖一些敏感信息。因此会存在 将仓库中所有 commit 合成一个 的需求。 直觉上,往往会用 rebase 和 squash 或 reset,不过我尝…

文件上传下载系列——如何实现文件秒传

文章目录 🎃简介: 👻核心思想: MD5是什么? 实现步骤: 🎄实操: 1、java生成文件MD5码 2、javascript生成文件MD5码 ⛳️基于秒传的分片上传下载 上传: 下载&…

交叉熵损失函数原理详解

交叉熵损失函数原理详解 在学习pytorch的神经网络模型里,经常用到交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,…

【Python】操作MySQL

一、Python 操作 Mysql的方式 Python 操作 Mysql 主要包含下面 3 种方式: Python-MySql Python-MySql 由 C 语法打造,接口精炼,性能最棒;但是由于环境依赖多,安装复杂,已停止更新,仅支持 Python…

密码学【java语言】初探究

文章目录 前言一 密码学1.1 古典密码学1.1.1 替换法1.1.2 移位法1.1.3 古典密码破解方式 二 近代密码学2.1 现代密码学2.1.1 散列函数2.1.2 对称密码2.1.3 非对称密码 二 凯撒加密的实践2.1 基础知识:ASCII编码2.2 ascii编码演示2.3 凯撒加密和解密实践2.4 频率分析…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef)和指数(exp)两个…