浅谈 RBAC 权限模型

news2024/9/23 23:24:46

写作背景

工作两年半了,笔者一直在做 To B 的产品,像是后端管理系统、Saas 系统都有接触过,它们都有一个共同点:权限管理。我每天都在接触但只是从前端开发这个角色去理解,我对整个业务流程其实是比较模糊的,所以写下这篇文章方便去帮助自己理解整个业务流程,并且尽量用易懂的文字去表达,希望大家看了也能有所收获。本篇文章主要讲述的是 RBAC 模型,后面再写相关的设计,敬请期待。

为什么需要权限系统

任何业务的产生总是伴随着一定的背景,权限系统也不例外,况且它还是一个 “刚需”。现如今的产品其实就是 数据制作数据消费 的时代,但并不是所有数据都能被全量消费的,为什么呢?

  • 产品需要盈利,某些数据的 “制造” 与 “消费” 通过订阅的方式按需收费。比如 Sass 平台服务会推出各种定价版本:个人版本、团队版本、公司版本,比如 ProcessOn石墨文档蓝湖 等平台。
  • 公司内部人员使用管理平台需要各司其职,不能越权操作。
  • 产品安全性,防止某些非法分子越权窃取数据。

可见权限系统是很有必要的,而基于角色的权限访问控制模型更为流行(RBAC),翻译过来其实就是: 具有某个角色的用户对某个资源操作的权限。下面我们看看这个模型的发展过程。

RBAC 模型发展历程

RBAC 全称 Role-Based-Access-Control, 即基于角色的访问控制。它的发展主要有四个模型:RBAC0RBAC1RBAC2RBAC3下面给大家详细介绍。

基础模型 - RBAC0

假设我们去设计一个权限系统,一定会有最基础的需求:给用户分配权限,一个用户可以被分配多个权限。其实这就是最简单的权限模型了,但有什么问题呢?

这种模型在只有几十个人的系统会很好维护,但对于具有成千上万用户的系统来说这就是一个灾难了,维护很困难。于是便在用户和权限之间引入了 角色 这个概念,这样只需要把权限授予给角色,不同的角色有不同的权限,而用户只需要关联某个角色就能完成整个流程了。

上述 用户-角色-权限 之间的关系其实就是 RBAC 最基础的模型了,它和 Linux 中的 用户-用户组-权限 很像,这样的好处就是可以批量调整权限了,比如某个角色某天需要添加别的权限时,只需要给角色绑定这个权限即可,而那些与这个角色关联的用户也便有了这个权限了。

角色继承 - RBAC1

RBAC0 是最为经典且简单的模型,也是目前最通用的模型。但是对于复杂一点的业务这个模型就需要调整一下了,比如公司组织架构划分,这里面涉及到 上下级 的关系,而且高级别角色会向下兼容拥有低级别角色的权限,于是便有了基于 角色继承RBAC1 模型。

这里的角色用图表示的话其实得用树状图,这里大家心里有个部门架构图就可以啦。

这个模型非常贴近现实业务的,比如公司的部门数据是不应该给所有员工看的,部门负责人是可以看本部门所有数据的,而小组长只能操作自己小组的数据,不能操作其他小组的数据。

角色权限限制 - RBAC2

RBAC1 基础上其实已经难满足大部分业务了,但是实际生活中,难免会遇到这样的情况:

  • 一个人不能 同时 扮演会计和审核员两个角色。
  • 部门老大只有一个。
  • 员工成为正式岗位前可能会经过实习期、试用期阶段,可用的权限不一样。

以上三个场景分为对应了:角色互斥性、角色唯一性、角色先决条件 等特征,这正是 RBAC2 模型的内容。这个模型的好处就是比如在使用某个系统的时候,不同角色操作同一份数据时可能存在冲突,此时需要限定同一时间只能使用一个身份进行数据操作。

最全的模型 - RBAC3

RBAC3 它整合了前面三种模型,形成了一个十分完整的权限管理模型,既有等级分层也有角色约束,比如最常见的公司组织架构。

新的 RBAC - 基于资源的访问控制

传统的 RBAC 会有一个问题,用户的想拥有某些权限必须先赋予对应的角色,当用户权限发生变化时必须通过添加一个角色来应对变化,但是这样在编码上就不好维护了。比如部门管理中,部门经理可以修改某些数据,用伪代码可以这么判断:

if (user.hasRole('manager')) {修改数据
} 

当业务变更,组长也可以修改数据时:

if (user.hasRoles(['manager', 'team_leader'])) {修改数据
} 

这样代码维护就成了问题,所以基于资源的权限访问控制模型(Resource-Based-Access-Control)就流行了起来,在传统模型基础上,它让用户也可以直接关联权限,这样就更加灵活了。

还是拿上面的场景来说,现在直接关联权限后:

if(user.hasPermission("修改权限标识")) {修改数据
} 

这种基于权限点判断的方式更加灵活,这样用户从部门经理变更为组长的身份后,不需要修改代码,代码的拓展性强。像很多后端的方案其实基于这种方式去做的,比如很经典的 shiro 权限系统。

总结

前面主要给大家介绍了 RBAC 的几个传统模型,现在做个总结:

  • RBAC0:最基础的模型,后面所有模型都会基于这个去演进。它的特点是非常简单且流程简单,但是对于复杂的业务比较难以进行细粒度的控制。
  • RBAC1:基于 RBAC0,引入角色继承概念,即角色存在了上下级关系,高等级向下兼容低等级角色拥有的权限,最常见的比如 部门负责人 - 部门经理 - 组长 - 组员 之间的关系。
  • RBAC2:在 RBAC1 基础上给角色增加了一定的限制,比如 角色互斥性、角色唯一性、角色先决条件 等特征,更加细粒度地去控制角色权限。
  • RBAC3:最全的权限模型,企业级模型。

这些模型很优秀,但是实际业务千变万化,有时候业务简单可能根本用不上这么庞大的权限模型,比如小公司就十几号人完全可以采用前文最开始提到的 用户 -> 权限 模型。而对于特别复杂的业务,我们有必要根据实际情况去调整策略,比如可以从开发成本、效率、公司组织架构去思考。

当然,目前比较流行的方式是:用户可以拥有角色的权限,也可以直接配置权限点,可以适应不同的业务需求。

小结最后提个疑问:前文说到 用户 -> 角色 -> 权限 解决了单独管理单个用户权限问题,可是用户与角色之间其实也是多对多关系,那么来一个用户就要授予一个角色,有成千上万个用户该怎么办?

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

第三部分:(主从)复合句——第一章:名词性从句

回顾:第二部分讲解的是并列句,即多件同等重要的事通过并列连词进行相连接,构成并列句 但是,现实生活中并不是许多事都是同等重要的,复合句就出现了,复合句全称为主从复合句 复合句 多件事不一样重要 主句…

GIS在地质灾害危险性评估与灾后重建中的实践技术应用及python机器学习灾害易发性评价模型建立与优化进阶

除滑坡灾害外,还包括崩塌、泥石流、地面沉降等各种地质灾害,具有类型多样、分布广泛、危害性大的特点。地质灾害危险性评价着重于根据多种影响因素和区域选择来评估在某个区域中某个阶段发生的地质灾害程度。以此预测和分析未来某个地形单位发生地质灾害…

社区买菜业务流程

前言 最近由于疫情的原因,很多城市的小区都不允许快递员上门送货了,用户只能到小区指定的地点进行取货。 多点、叮咚买菜、美菜、盒马等电商着实火了一把,每天的订单量都非常的多,他们都依托于超市或线下门店等进行接单、商品打…

解锁 Android 手机的11大有效技巧

想了解如何在没有密码或图案的情况下解锁 Android 智能手机吗?按照以下 10 大最佳技巧解锁 Android 手机。 人们很可能会在智能手机上应用屏幕锁定图案或密码以保护隐私。为防止其他人访问您的手机和您的个人数据,设置屏幕锁定密码或图案至关重要。内置…

Python_pytorch (二)

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包(package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法(def) Torchvision 数据集 数据集使用(CI…

Archery-SQL审核查询平台

Archery-SQL审核查询平台 文章目录Archery-SQL审核查询平台一、功能列表介绍1.1、SQL审核MySQL实例非MySQL实例审核执行分离SQL工单自动审批、高危语句驳回快速上线其他实例定时执行1.2、SQL查询多类型数据库支持授权管理页面体验1.3、SQL优化慢日志管理SQL语句优化1.4、实例管…

centos7.8安装oralce11g

文章目录环境安装文件准备添加用户操作系统环境配置解压安装问题解决创建用户远程连接为了熟悉rman备份操作,参照大神的博客在centos中安装了一套oracle11g,将安装步骤记录如下环境安装文件准备 这里准备一台centos7.8 虚拟机 配置ip 192.168.18.100 主…

【Linux】软件安装(三分钟教会你如何在linux下安装软件)

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️Linux之路       🛰️社区:✈️进步学堂 目录&…

MySQL中对于单表和多表的操作

一、单表查询素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等显示所有职工的基本信息。mysql8.0 [chap03]>select * from worker;查询所有职工所属部门的部门号,不显示重复的部门号。mysql8.0 [cha…

C++100-C++拓展001-异常平方根计时功能

文章目录C100-C拓展-异常平方根计时功能摘要C异常实现C异常简介C异常捕获捕获异常捕获指定异常 std::out_of_range e捕获throw的异常抛出int异常并捕获除数为0的异常捕获C实现求平方和平方根利用math.h的pow求平方和平方根利用math.h求开根号自定义pow函数实现求平方完成循环计…

NSSCTF Round#8 web专项赛

文章目录MyPage方法一: pearcmd.php方法二:多级连接绕过方法三: PHP Base64 Filter 宽松解析MyDoorUpload_gogoggoez_nodeMyPage Where is my page? 拿到题目就是这个样子 感觉就是文件包含 可以读取,可以用filter协议…

AXI-Stream 学习笔记

参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线,描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE&#xff1…

Vue3.0文档整理:一、简介

1.1:什么是vue? Vue是一款用于构建用户界面的javascript框架;它基于标准HTML、CSS和Javascript构建,并提供了一套声明式、组件化的编程模型,帮助你高效的开发用户界面。 1.2:MVVM工作原理 MVVM指的是model、view和vie…

TCP协议原理一

文章目录一、TCP协议二、TCP工作机制1.确认应答2.超时重传3.连接管理三次握手四次挥手一、TCP协议 我们的TCP协议相比于UDP协议复杂不少,今天我们就来一起学习一下TCP协议报文和原理 首先我们报头第一行里的端口号和UDP的端口号是一致的,都是用两个字节…

进大厂必备的Java面试八股文大全(2023最新精简易懂版,八股文中的八股文)

为什么同样是跳槽,有些人薪资能翻三倍?” 最近一个粉丝发出了灵魂拷问,类似的问题我收到过很多次,身边也确实有认识的同事、朋友们有非常成功的跳槽经历和收益,先说一个典型例子: 学弟小 A 工作一年半&am…

智云通CRM:买对了吗——大客户采购的方案实施

一旦采购合同签署后,供应商就要履行合同,按时交付产品进场使用,或实施服务方案。不过,无论对供应商还是客户来说,双方的合作并没有就此结束。 在这个阶段,客户会评估此次合作的供应商做事是否靠谱&#x…

Spring面试重点(四)——Spring事务

Spring事务 事务的方式 spring中使用事务有两种方式,一种是编程式事务,一种是声明式事务。编程式事务推荐使用TransactionTemplate,实现TransactionCallback接口,需要编码实现;声明式事务只需要在函数增加注解Transa…

【项目设计】—— 基于Boost库的搜索引擎

目录 前言 一、项目的相关背景 1. 什么是Boost库 2. 什么是搜索引擎 3. 为什么要做Boost搜索引擎 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 1. 正排索引(forword index) 2. 倒…

Linux tcpdump

tcpdump - 转储网络上的数据流 是不是感觉很懵?全方位描述tcpdump: 通俗:tcpdump是一个抓包工具,用于抓取网络中传输的数据包形象:tcpdump如同国家海关,凡是入境和出境的货物,海关都要抽样检查&#xff0…

新瑞鹏“狂飙”,宠物医疗是门好生意吗?

宠物看病比人还贵,正在让不少年轻一族陷入尴尬境地。在知乎上,有个高赞提问叫“你愿意花光积蓄,给宠物治病吗”,这个在老一辈人看来不可思议的魔幻选择,真实地发生在当下的年轻人身上。提问底下,有人表示自…