什么是 RBAC 模型?

article/2025/9/16 9:24:31

前言

RBAC(Role-Based Access Control),基于角色的访问控制,现在主流的权限管理系统的权限设计都是 RBAC 模型,或者是 RBAC 模型的变形。

我们需要思考一个问题:为什么要做权限的管理

我的理解是在每一个系统中,每个用户所拥有的权限是不一样的,例如一个数据表,管理员可以修改、增加、查看等操作,而普通用户只能查看。所以如何进行用户权限的设计,就是我们需要考虑的问题了。


RBAC 模型是什么

RBAC(Role-Based Access Control),基于角色的访问控制。通过用户关联角色,角色关联权限,来间接的为用户赋予权限。

在这里插入图片描述

有一个问题需要我们思考:为什么要增加角色这一层关系呢?我直接用户关联权限不就行了?

假如有一些用户具有相同的权限,增加时需要为这些用户增加相同的权限,修改时同样也要修改相应的权限。如果有了角色,我们就可以直接将这些用户与同一个角色相对应。增加时只需要为用户绑定角色就行,修改时只需要修改这一个角色就行。

其实我的理解,最重要的是和现实生活相对应。比如学校,每个人(用户)都有不同的身份(角色),并且都有不同的权限。就举个例子吧,比如说一个老师,他不仅仅是老师,还是副院长,所以我们可以为他关联老师、副院长这两个角色,但他不是副院长的时候,升到院长了,我们就可以把副院长这个角色给取消关联,把院长这个角色为他关联上。公司也是同理,这样操作是不是感觉非常的舒服(可以想象一下没有角色应该怎样实现,一对比就懂得 RBAC 模型的好处了)。

其实这就是加一层的思想,就像 Java 中操作数据库,JDBC 不就是加的那一层,我们只需要面对 JDBC 就行了;还有集群做流量分发、负载均衡的时候,网关、Nginx 不就是加的那一层;同理 角色 也是加的那一层。

可以去了解一下 Linux 的权限管理!


RBAC 模型的分类

RBAC0 模型

最简单的用户、角色、权限模型。这里面包含两种:

  1. 用户和角色是多对一关系。即:一个用户只对应一个角色,一个角色可以对应多个用户。
  2. 用户和角色是多对多关系。即:一个用户可以对应多个角色,一个角色可以对应多个用户。

如果系统功能比较单一,使用人员较少,岗位权限相对清晰且确保不会出现兼岗的情况,此时可以考虑用多对一的权限体系。其余情况尽量使用多对多的权限体系,保证系统的可扩展性。如:张三既是行政,也负责财务工作,那张三就同时拥有行政和财务两个角色的权限。


RBAC1 模型

RBAC0 的基础上引入了角色继承的概念。即:子角色可以继承父角色的所有权限。

使用场景:如某个业务部门,有经理、主管、专员。主管的权限不能大于经理,专员的权限不能大于主管,如果采用 RBAC0 模型做权限系统,极可能出现分配权限失误,最终出现主管拥有经理都没有的权限的情况。

RBAC1 模型就很好解决了这个问题,创建完经理角色并配置好权限后,主管角色的权限继承经理角色的权限,并且支持在经理权限上删减主管权限


RBAC2 模型

基于 RBAC0 模型,增加了对角色的一些限制:角色互斥、基数约束、先决条件角色等。

  • 角色互斥:同一用户不能分配到一组互斥角色集合中的多个角色,互斥角色是指权限互相制约的两个角色。案例:财务系统中一个用户不能同时被指派给会计角色和审计员角色。
  • 基数约束:一个角色被分配的用户数量受限,它指的是有多少用户能拥有这个角色。例如:一个角色专门为公司 CEO 创建的,那这个角色的数量是有限的。
  • 先决条件角色:指要想获得较高的权限,要首先拥有低一级的权限。例如:先有副总经理权限,才能有总经理权限。
  • 运行时互斥:例如,允许一个用户具有两个角色的成员资格,但在运行中不可同时激活这两个角色。

RBAC3 模型

称为统一模型,它包含了 RBAC1RBAC2,利用传递性,也把 RBAC0 包括在内,综合了 RBAC0RBAC1RBAC2 的所有特点,这里就不再多描述了。


什么是权限

权限是资源的集合,这里的资源指的是软件中所有的内容,包括模块、菜单、页面、字段、操作功能(增删改查)等等。具体的权限配置上,目前形式多种多样,按照我个人的理解,可以将权限分为:页面权限、操作权限和数据权限

页面权限:所有系统都是由一个个的页面组成,页面再组成模块,用户是否能看到这个页面的菜单、是否能进入这个页面就称为页面权限。

操作权限:用户凡是在操作系统中的任何动作、交互都是操作权限,如增删改查等。

数据权限:一般业务管理系统,都有数据私密性的要求:哪些人可以看到哪些数据,不可以看到哪些数据。比如京东广东地区的负责人,他可以看到广东地区的仓库信息,但他看不到北京地区的仓库信息,因为这不是他的数据权限范围。


用户组

当平台用户基数增大,角色类型增多时,如果直接给用户配角色,管理员的工作量就会很大。这时候我们可以引入一个概念“用户组”,就是将相同属性的用户归类到一起。

例如:加入用户组的概念后,可以将部门看做一个用户组,再给这个部门直接赋予角色(1万员工部门可能就几十个),使部门拥有部门权限,这样这个部门的所有用户都有了部门权限,而不需要为每一个用户再单独指定角色,极大的减少了分配权限的工作量。

同时,也可以为特定的用户指定角色,这样用户除了拥有所属用户组的所有权限外,还拥有自身特定的权限。

用户组的优点,除了减少工作量,还有更便于理解、增加多级管理关系等。如:我们在进行组织机构配置的时候,除了加入部门,还可以加入科室、岗位等层级,来为用户组内部成员的权限进行等级上的区分。

除了减少工作量,还有更便于理解。比如按部门建立用户组的例子。一位用户从A部门异动到了B部门,这是实际发生的情况。如果没有用户组,那么我们要拿掉A部门的所有角色,换上B部门的所有角色。这种操作的本质没有区别,但是与实际情况的表现形式就有些差别了,不容易理解。加上用户组之后,只需要操作用户离开A组而加入B组就行了。这与实际情况很贴近。


项目参考

这是一个网上很出名的一个开源项目,和我并无关系!

若依权限管理系统

演示图片:

img

img

img

img

img

img


http://chatgpt.dhexx.cn/article/aT0Mpw6V.shtml

相关文章

RBAC权限管理(详细)

RBAC权限设计思想 为了达成不同账号(员工、总裁)登录系统后看到不同页面,执行不同功能,RBAC(Role-Based Access control)权限模型,就是根据角色的权限,分配可视页面。 三个关键点: 用户:使用系统的人 角色:使用系统…

什么是RBAC

一、RBAC是什么 1、RBAC模型概述 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是20世纪90年代研究出来的一种新模型,但其实在20世纪70年代的多用户计算时期,这种思想就已经被提出来,直到…

最小生成树,秒懂!

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇 作者丨bigsai 来源丨bigsai 前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法。但是可能很多人对概念不是…

算法 - 最小生成树实现

算法能力是一个门槛,也是个有基础的门槛 无论你是iOS工程师,android工程师,java工程师,前端,后端还是全栈等等… 算法能力的强弱一方面在于思想,你是否有计算机思维抽象具体问题的能力 更重要的还在与基…

最小树形图(有向图的最小生成树)

我们知道,无向图的最小生成树的求法有Krusal和prime算法,一个是归点一个是归边,在具体实现上Krusal可以用并查集实现,难度不大。 这里稍微区别一下最短路径和最小生成树(因为我又搞混了23333) 最小生成树能…

Kruskal算法(最小生成树)

上篇Prim算法简要的讲解了最小生成树。也提到过Prim算法堆优化,但本蒟蒻并没有贴Prim (堆优化的代码)。至于为什么没有贴呢?上篇Prim算法blog末尾有说明。 好勒!咱们接着讲Kruskal算法。这跟Prim算法有很大的…

最小生成树matlab求解

一、最小生成树 连通所有顶点且总路径最小修建连通7个城市的铁路网,可修建的路线和对应造价如图所示,如何修建使总费用最少? 问题分析: 连通7个城市:生成的图中,从任意顶点起步,沿着边一定可以…

最小生成树——贪心算法

文章目录 1.生成树和最小生成树1.1 问题的定义1.2 MST性质 2.普里姆算法(Prim)2.1 算法流程2.2 算法正确性证明2.3 算法实现2.4 时间复杂度2.5 测试代码 3.克鲁斯卡尔算法(kruskal)3.1 算法流程3.2 算法正确性证明3.3 算法实现 参…

C++ 最小生成树

目录: 前置知识 最小生成树 Prim 算法 kruskal 算法 前置知识: 连通图:在无向图中,若任意两个顶点 u 与 v 都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点 u 与 …

最小生成树(C语言实现)

求这个网的最小生成树 /** 普里姆算法和克鲁斯卡尔算法求最小生成树* 采用邻接矩阵存储**/ #include<stdio.h>#define MAX_VERTEX_NUM 20 //图的定义 typedef struct {int vertexNum;int edgeNum;char vertex[MAX_VERTEX_NUM];int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]…

最小生成树(C语言)

最小生成树问题&#xff08;C语言&#xff09; 所谓一个 带权图 的最小生成树&#xff0c;就是原图中边的权值最小的生成树 &#xff0c;所谓最小是指边的权值之和小于或者等于其它生成树的边的权值之和。 kruskal 克鲁斯卡尔算法&#xff08;Kruskal&#xff09;是一种使用贪…

最小生成树kruskal算法

最小生成树kruskal算法 概述算法分析代码 概述 克鲁斯卡尔 ( K r u s k a l ) (Kruskal) (Kruskal)算法是求连通网的最小生成树的另一种方法。与普里姆 ( P r i m ) (Prim) (Prim)算法不同&#xff0c;它的时间复杂度为 O ( e l o g e ) O(eloge) O(eloge)(e为网中的边数)&…

最小生成树:

定义&#xff1a; 将图中的 n 结点用 n-1 条边连接起来&#xff0c;使其各个边的权值之和最小的生成树。 普里姆算法&#xff1a; 从点的角度出发。 1、start 数组的值表示起始点的下标&#xff0c;start 的下标代表目的顶点&#xff1b;lowcost 数组的下标代表目的顶点&…

图——最小生成树

图——最小生成树 1. 基本概念 在一个连通无向图G(V, E)中&#xff0c;对于其中的每条边(u,v)∈E&#xff0c;赋予其权重w(u, v)&#xff0c;则最小生成树问题就是要在G中找到一个连通图G中所有顶点的无环子集T⊆E&#xff0c;使得这个子集中所有边的权重之和w(T) ∑ ( u , …

最小生成树的Kruskal算法-详解

最小生成树的Kruskal算法 一、 什么是最小生成树 1.1 最小生成树定义&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c;并且有保持图连通的最少的边。最小生成树可以用kruskal&#xff08;克鲁斯卡尔&a…

最小生成树(C语言简单实现)

最小生成树 本文参考自《大话数据结构》 一个连通图的生成树是一个极小的连通子图&#xff0c;它含有图中全部的顶点&#xff0c;但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树 。 找连通网的最小生成树&#xff0c;经典的有两种算法&#…

最小生成树怎么画?

介绍最小生成树的图形画法~以下图为例&#xff1a; 1、从1开始&#xff0c;以1为顶点画圈。在红色线经过的部分中&#xff0c;可见权重分别为6、1、5&#xff0c;最小权重为1。如下图。 2、以上图中得到的1、3为顶点的图中&#xff0c;继续画线&#xff0c;图为黄色线部分。经过…

最小生成树算法

最小生成树算法 生成树的概念最小生成树算法Prim算法Kruskal算法 生成树的概念 若图是连通的无向图或强连通的有向图&#xff0c;则从其中任一顶点出发&#xff0c;调用一次 d f s dfs dfs或者 b f s bfs bfs后&#xff0c;可以系统的访问图中所有顶点。若图是有根的有向图 &a…

【图】最小生成树

最小生成树&#xff1a;构造连通网的最小代价生成树。 最小生成树有两种算法&#xff1a;普利姆算法、克鲁斯卡尔算法。 普利姆&#xff08;Prim&#xff09;算法 加点&#xff0c;选择相邻点中边权最小的 需要两个一维数组&#xff0c;一个存权值&#xff0c;另一个存起始点…

最小生成树-Kruskal算法

数据结构:最小生成树-Kruskal算法 什么是最小生成树&#xff0c;最小生成树就是求图中把所有点都访问到的最短路径的长度 Kruskal算法采用的是边贪心思想&#xff0c;我们先大概讲一下它的大概思想&#xff0c;首先我们先假设先隐藏所有的边&#xff0c;这样每个点会成为一个连…