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

news2024/11/28 6:52:30

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.coloradmin.cn/o/474570.html

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

相关文章

验证回文串

题目:验证回文串 思路: 这段代码是一个判断字符串是否为回文的函数。它接受一个 string 类型的参数 s,并依次执行两个步骤: 首先对字符串进行预处理: 将大写字母转换成小写字母;移除非字母数字字符。 然…

平均10870元!2023一季度居民可支配收入公布(文末附最新招聘岗位)

今天是五一假期的第一天,暂别职场的打工人已经开始扎入人从众中放肆玩乐了,小编已经流下了羡慕的泪水。不过,今年的五一除了人流量上暴涨之外,出行成本也没被少吐槽,机票咱就不说了,酒店民宿的涨幅简直到了…

医院信息系统HIS源码——接口技术:RESTful API + WebSocket + WebService

云HIS系统采用SaaS软件应用服务模式,提供软件应用服务多租户机制,实现一中心部署多机构使用。相对传统HIS单机构应用模式,它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景,并提升区域内应用的标准化与规范…

fc坦克大战游戏完美复刻

文章目录 一、 介绍二、 制作基本物体三、 控制玩家坦克移动、转向四、 子弹脚本、爆炸脚本五、 敌人AI寻路算法六、 坦克生成点脚本七、 用链表实例化地图八、 玩家游戏控制器脚本九、 添加音效十、 资源包 一、 介绍 儿时经典游戏《坦克大战》完整复刻 发射子弹、生成敌人、…

「欧拉定理」[SDOI2008]仪仗队

[SDOI2008]仪仗队 https://ac.nowcoder.com/acm/problem/20313 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练。 仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所…

Golang每日一练(leetDay0050)

目录 147. 对链表进行插入排序 Insertion Sort List 🌟🌟 148. 排序链表 Sort List 🌟🌟 149. 直线上最多的点数 Max Points On A Line 🌟🌟🌟 150. 逆波兰表达式求值 Evaluate Reverse …

DDS基本原理与FPGA实现

DDS基本原理与FPGA实现 定义:DDS是指DDS信号发生器,采用直接数字频率合成技术。是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广…

服务运营| Healthcare Management Science 近期文章精选

作者:李舒湉 王畅 (一) Screening for preclinical Alzheimer’s disease: Deriving optimal policies using a partially observable Markov model nen Dumlu Z, Sayın S, Grvit İ H. Screening for preclinical Alzheimer’s disease: …

UG NX二次开发(C#)-显示-更改对象颜色

文章目录 1、前言2、UG NX中的更换对象颜色的功能3、采用UG NX二次开发实现颜色修改3.1 采用直接赋值对象颜色不能直接更改对象颜色3.2 采用NewDisplayModification的方法如下:1、前言 当一个三维模型展现在我们面前时,总会有颜色赋予三维模型的对象上,比如红色、蓝色、银灰…

工具链与其他-移动端网络优化的指标和策略

目录 网络指标 一个请求的时间消耗 页面加载 常见性能指标 网络优化策略 缓存 压缩 请求合并 离线包 预加载(前端大流量数据) 网络指标 一个请求的时间消耗 一个请求的发生到返回回来;有3部分时间 1.Scheduling(排队&…

初识C++之异常

目录 一、C中的常用处理错误方式 二、C异常的概念 1. throw 2. catch 3. try 三、异常的使用 1. 异常的抛出和捕获 1.1 异常的抛出和匹配原则 1.2 在函数调用链中异常栈展开匹配原则 四、异常体系 1. 自定义异常体系 2. C中的异常体系 五、 异常安全 六、异常规范…

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

项目是根据官网的示例工程进行修改的,版本参数如下: unity:2021.2.20 wolong:v2.1.0 il2cpp_plus:v2021_2.1.0 ------------------------------------------------------------- 1、安装:参考:第一篇文章Unity 热…

pytest - Getting Start

前言 项目开发中有很多的功能,通常开发人员需要对自己编写的代码进行自测,除了借助postman等工具进行测试外,还需要编写单元测试对开发的代码进行测试,通过单元测试来判断代码是否能够实现需求,本文介绍的pytest模块是…

虚幻图文笔记:Substance Painter通过USD格式导入UE5的工作流

什么是USD格式 USD即Universal Scene Description,是著名的Pixar公司研发的一种开源的3D 场景说明和文件格式,如其名所示,相较于传统的FBX、Obj等3D格式,USD的具有更好的通用性和扩展性,现在已被非常多的厂商和平台所…

使用树莓派(zero2w + Camera Module 3 支持自动对焦 1200 万像素)拍照

拍照硬件 Raspberry Pi Camera Module 3Raspberry Pi Zero 2 W 1. 注意排线连接方向 2. 烧录系统 3. 进行系统更新需要联网,注意只支持最新的bullseye系统。每条指令大概需要10 分钟。 sudo apt-get update -y sudo apt-get upgrade -y4. 拍摄一张全像素的JPEG图像…

自己做小程序开个社区团购可行吗?

在如今的社交化时代,随着社区经济的发展,越来越多的人开始探索社区团购的商业模式。而随着小程序的普及,自己开发一个社区团购小程序也成为了一种可能。但是,自己做小程序开个社区团购真的可行吗?我们来一起分析一下。…

Spring整合MybatisJunit单元测试

Spring整合Mybatis&Junit单元测试 1. Spring整合Mybatis【重点】1.1 思路分析问题导入1.1.1 MyBatis程序核心对象分析1.1.2 整合MyBatis 1.2 代码实现【前置工作】【第一步】导入Spring整合Mybatis依赖【第二步】创建JdbcConfig配置DataSource数据源【第三步】创建MybatisC…

【ARMv8 编程】A64 内存访问指令——内存加载指令

与所有先前的 ARM 处理器一样,ARMv8 架构是一种加载/存储架构。这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中,修改,然后存储到内存中。该程序必须指定地址、要传输的数据大小以及源或目标寄存器。有额…

《使用深度神经网络对光电容积脉搏图进行归一化,以进行个体和群体比较》阅读笔记

目录 一、论文摘要 二、论文十问 Q1:论文试图解决什么问题? Q2:这是否是一个新的问题? Q3:这篇文章要验证一个什么科学假设? Q4:有哪些相关研究?如何归类?谁是这一…

symfonos 1(smtp注入webshell,配合文件文件包含)

目录 扫描 SMB 提权 扫描 SMB 让我们使用SMBMAP检查这些目录的权限。 smbmap -d workgroup -H www.example.com 可能/匿名帐户可访问。 使用smb尝试连接共享网络以访问/anonymous目录。[smb://192.168.59。129/]