权限模型设计——资源-组-标签模型/Resources-Group-Tag(RGT)

1、前言

RBAC模型可以说是权限模型的事实标准了,也有大量基于其的变种或增强设计,如RBAC0、RBAC1、RBAC2、RBAC3等等,但其设计或实现都太过繁琐和复杂了,这里借用一位博友做的RBAC3模型作比较(各有所长,无比较高低之意,仅借为基础作展开讲解),表设计图如下:

图1

仅仅一个权限就有15个表之多,而且大多数表相互之间都有多对多关联,复杂度之高~~~就这,还没有实现最全的权限系统,如SaaS所需要的数据分离、数据合并等数据权限功能基于这个设计就很难实现(其设计中仅有基于组织的数据隔离,并且组织和权限在同一个维度);另外由于其设计是针对一个具体的系统进行的,太具象了,不够通用,较难移植。

RGT模型:先上一张最终的表设计图,核心的思想就是把对象进行统一抽象(多个类似对象抽象为一个)、简化(用一个表来表达一对多关系),应用到具体应用中时只需要拓展资源表的字段即可。

图2

与图1相比,把用户、权限统一抽象为资源,并使用URI管理上下级关系(类似文件系统的机制,优势:可使用索引);把组织、身份、用户组、角色统一抽象为组,组本身是树结构,资源和组之间是多对多关系,这就完成了图1所支持的功能。另外新添加了另一个维度——标签,用于从另一个维度做数据权限功能。

2、权限模型对比

RGT核心思想也是源自于RBAC模型,但对RBAC模型有进一步抽象。

RBAC基础模型:

RGT基础模型:

把RBAC中的用户和权限统一抽象成了资源、把角色抽象成了组,在这个基础上增加了标签,用于实现数据隔离、数据合并等数据权限功能。

RBAC常用结构:

其中用户为线性表,权限可级联,角色可拓展为树,如下:

对于其它层次的拓展也是基于用户-角色,如图1的组织架构、用户组等。

RGT常用结构:

其中资源、组、Tag本身都可以是树结构。

这里Tag只是一个维度的统一叫法,可以用来表示任何概念,如国家、公司、域、网段、租户等等。

3、复杂度对比

时间复杂度:

由于RBAC可能存在多级多对多级联,而RGT最多只存在一次多对多级联,故在时间复杂度上RGT更优。基于缓存的情况下这个优势会非常明显。

逻辑复杂度:

由于RGT比较抽象,在理解和实际操作中需要对整个设计都非常明确;而RBAC每个表的意义都很确定,操作简单;故逻辑复杂度RBAC更优。

开发复杂度:

RBAC有大量的表和表关系,开发复杂度很高,特别是多级缓存会很难设计;RGT一般就3张表,最多4张表,开发和拓展都比较简单。

PS:空间复杂度相差不大,不作比较。

4、实施的具体步骤

经过前面的对比,自行选择适合的方案,后续章节仅针对RGT展开。

4.1、定义资源、组、Tag

确认模型后的第一步需要根据实际项目情况定义资源、组、Tag分别代表什么。以图1为案例(后续也使用该业务为案例),在其基础上拓展一层公司,公司与公司间的权限完全隔离,公司内部的权限采用层级管理;那么资源代表用户和权限,组代表组织、身份、用户组、角色,Tag代表公司。

4.2、套入模型

模型只是定义了权限相关的设计,并没有包含业务,需要把模型套入实际的项目中并且根据实际业务情况拓展用户、公司等基础信息的字段,并且在需要做数据权限的相关业务表上添加Tag字段(复杂数据权限可以使用多对多)。

4.3、基础数据初始化

要让权限系统正常工作,需要预先把基础的用户、权限、组织、身份、用户组、角色、公司等信息添加到系统中。

4.4、鉴权

当某个用户请求某个资源时,首先判定该用户是否具有访问该资源的功能权限(查询资源-组映射表),然后判定该用户是否具有访问该资源的数据权限(查询Tag)。

4.5、优化

至此,核心业务功能已经完成了,对性能没要求的业务就结束了。

由于鉴权是无处不在的,如果每一个动作都按如上操作进行鉴权,那性能是无法忍受的(一次鉴权至少需要3次查询,平均开销50ms+),那就开始优化吧。第一步:直接缓存4个表的数据,平均开销能压到5ms左右。第二步:重构4个表的数据,采用K-V结构缓存,平均开销能压到2ms左右。第三步:集中缓存+本地缓存,平均开销能压到0.1ms左右。

注:实际步骤之间没有顺序关系,为了表达性能提升的递进关系才按顺序写,缓存是以空间换时间,请根据实际需要进行选择。

史上最强大的权限系统设计方案——极简主义相关推荐

  1. 强烈推荐:Android史上最强大的自定义任务软件Tasker

    强烈推荐:Android史上最强大的自定义任务软件Tasker http://bbs.mumayi.com/thread-28387-1-1.html (出处: 木蚂蚁手机乐园) Android上的T ...

  2. GPT-4发布!史上最强大模型来了

    Datawhale分享 最新:GPT-4,来源:量子位 一觉醒来,万众期待的GPT-4,它来了! OpenAI老板Sam Altman直接开门见山地介绍说: 这是我们迄今为止功能最强大的模型! 有多强 ...

  3. 【他山之石】GPT-4发布!史上最强大模型来了

    来源:量子位 "他山之石,可以攻玉",站在巨人的肩膀才能看得更高,走得更远.在科研的道路上,更需借助东风才能更快前行.为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程 ...

  4. 史上最全储能系统优缺点梳理

    史上最全储能系统优缺点梳理1 [摘要]现有的储能系统主要分为五类:机械储能.电气储能.电化学储能.热储能和化学储能.目前世界占比最高的是抽水蓄能,其总装机容量规模达到了127GW,占总储能容量的99% ...

  5. PHP注册登录系统(一)-极简

    按: 所用语言:PHP 数据库 :MySQL // 创建数据库test create database test; // 创建数据表 create table user(id int(10) not ...

  6. 基于python的个人博客_一款基于 Django 的极简主义个人博客系统

    shadow_blog 介绍 shadow_blog 是一款基于 Django 的极简主义个人博客,已应用在苍茫误此生博客 前端基于 Boundless-UI,风格简约.支持响应式布局, 已适配主流的 ...

  7. 新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图

    新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图. 使用技术: 客户端前端:Next.js + React 管理端前端:React + Ant De ...

  8. 原子性 可见性 有序性_极简主义的内容可见性

    原子性 可见性 有序性 A couple of years ago, Minimalism as a concept took over the design world. 几年前, 极简主义作为一种 ...

  9. 定制化和极简主义风格的安卓,看你pick谁?

    首先得了解一下什么是Android(安卓)?wiki上对Android的定义 : Android(安卓)是一个基于linux核心的开放原始码行动作业系统,是由谷歌成立的开放手机联盟持续领导与开发. 不 ...

最新文章

  1. SQLServer之函数简介
  2. 如何在 CentOS 上启用 软件集 Software Collections(SCL)
  3. 一文搞懂负载均衡中的一致性哈希算法
  4. nginx+php+memcache高速缓存openresty)
  5. 大世界游戏制作:《幽灵行动·荒野》程序化技术介绍
  6. 刷新SqlServer所有视图【存储过程】
  7. C语言strstr函数实现
  8. SAP License:自动创建带内部订单预算管控的在建工程
  9. Python九九乘法表(作业)
  10. Cache之全相连映射
  11. 怎么用计算机算全勤奖,全勤奖计算与发放细则
  12. 【出国面试】出国 交换 / 访学 / 留学 国外导师面试经验分享
  13. 计算机桌面出现蓝色底色,电脑桌面图标有蓝色阴影 - 电脑桌面图标有蓝底怎么办 - 安全专题...
  14. 加拿大大西洋雇主担保移民 这个项目好申请吗?
  15. 【排序】折半插入排序
  16. 【翻译】国际标准 IEC TR 63145-22-10 |AR类型的特定测量方法. 光学性能
  17. [PTA]习题11-1 输出月份英文名
  18. mos管结电容等效模型_深入理解电容器的等效串联电阻(ESR)
  19. 微信端小区垃圾回收系统
  20. html if函数,IF条件判断函数还不会就out了,IF函数七种条件判断用法都在这

热门文章

  1. 互联网java工程师面试突击第三季知识点总结
  2. 构建商业化思维,实现组织商业价值——商业分析学习笔记(1)
  3. 阶乘后面有多少个0!!!
  4. vue路由无痕浏览nodeJS环境搭建ElementUI简介
  5. 【第55题】输入、输出系列3-文件的天下大势
  6. mysql查询跟某个人同在部门_MySQL 查询习题详解
  7. Vim/Neovim中的宏
  8. 如何将kali系统写入U盘,并在U盘中启动。
  9. 【Grammar】in 和 within 用法和区别
  10. 【mybatis的复杂查询】