权限模型设计——资源-组-标签模型/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. canny边缘检测 关于2个阈值参数
  2. Windows7操作系统自定义运行命令(简单方法之二)
  3. Java多线程编程实战指南
  4. ZOJ 3965 Binary Tree Restoring
  5. html 输入框防止自动记忆,网页输入框input填写内容自动记忆功能怎么去除
  6. python之路-SQLAlchemy
  7. 阿里云96页报告详解《云上转型》(10个案例、10大趋势/完整版PPT)
  8. mysql 获得年月函数_mysql之日期函数
  9. [系统控件重绘教程(一)]重绘NSWindow
  10. 中兴微ZXIC方案MF782型4G随身WIFI开启ADB,开启锁频等功能
  11. 计算机启动后出现黑屏鼠标,电脑开机黑屏只有鼠标,小编教你电脑开机黑屏鼠标能动怎么办...
  12. 大数据架构师深入学习视频教程
  13. 【Axure交互教程】 隐藏页面滚动条的3种方法
  14. unity3d5.1物体椭圆旋转选择界面实现(一)
  15. Android:判断App是否是首次focuse
  16. 三国志2霸王的大陆 攻防计算
  17. 用户输入一句话,查找“呵”的位置
  18. 聊聊GPU利用率那些事
  19. 毕设题目:Matlab无人机三维路径规划
  20. 【TypeScript】TypeScript基础

热门文章

  1. 无孔物品在拉苏克那里打出的孔数
  2. 域名怎么与主机空间绑定
  3. c语言开发百度地图,百度地图开发(一)
  4. BOSS系统技术架构
  5. 达梦数据性能诊断与优化
  6. 一名不务正业的程序员书单【持续更新】
  7. 阿里云域名备案与实名认证注意问题
  8. 还原杭州“8·4”保时捷撞人现场
  9. 顺丰无人机的前世今生
  10. 基于对话框的MFC界面添加菜单栏