【设计模式】RBAC 模型详解

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、什么是 RBAC 呢?

二、RBAC 的组成

三、RBAC 的优缺点

3.1 优点:

3.2 缺点:

四、RBAC 的 3 种模型

4.1 RBAC0

4.2 RBAC1

4.3 RBAC2

五、总结


前言

随着软件系统的复杂性和规模的不断增长,权限管理成为了一个至关重要的问题。

在大型多人协作的系统中,如何有效地管理不同用户的访问权限,确保系统的安全性和稳定性,是每一个开发者都需要面对的挑战。为了解决这一问题,业界提出了一种被广泛应用的权限管理模型——基于角色的访问控制(Role-Based Access Control,简称RBAC)。

希望通过本篇博客的学习,您能够深入了解RBAC模型的核心思想和实现原理,掌握如何在实际项目中应用RBAC模型来提高系统的安全性和可维护性。

同时,我们也希望您能够将RBAC模型的思想和方法应用到其他类似的场景中,为您的开发工作带来更多的便利和效率。


一、什么是 RBAC 呢?

 RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。

简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。如下图:

以下是一个简单的RBAC模型的代码示例,使用Python编写:

class User:  def __init__(self, name):  self.name = name  self.roles = []  def add_role(self, role):  self.roles.append(role)  def has_role(self, role):  return role in self.roles  class Role:  def __init__(self, name):  self.name = name  self.permissions = []  def add_permission(self, permission):  self.permissions.append(permission)  def has_permission(self, permission):  return permission in self.permissions  class RBAC:  def __init__(self):  self.users = {}  self.roles = {}  def register_user(self, user):  self.users[user.name] = user  def register_role(self, role):  self.roles[role.name] = role  def assign_role(self, user, role):  user.add_role(role)  role.add_user(user)  def check_permission(self, user, permission):  for role in user.roles:  if role.has_permission(permission):  return True  return False

在这个示例中,我们定义了三个类:User、Role和RBAC。

  • User类表示用户,具有添加和检查角色的方法。
  • Role类表示角色,具有添加和检查权限的方法。
  • RBAC类是权限管理的主要类,具有注册用户、注册角色、分配角色和检查权限的方法。

在check_permission方法中,我们遍历用户的所有角色,检查每个角色是否具有所需的权限,如果找到一个角色具有该权限,则返回True。

如果没有任何角色具有该权限,则返回False。


二、RBAC 的组成

 在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。

RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理:

  • User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
  • Role(角色):不同角色具有不同的权限
  • Permission(权限):访问权限
  • 用户-角色映射:用户和角色之间的映射关系
  • 角色-权限映射:角色和权限之间的映射

它们之间的关系如下图所示:


三、RBAC 的优缺点

3.1 优点

  • 简化了用户和权限的关系
  • 易扩展、易维护

3.2 缺点:

  • RBAC模型没有提供操作顺序的控制机制,这一缺陷使得RBAC模型很难适应哪些对操作次序有严格要求的系统

四、RBAC 的 3 种模型

4.1 RBAC0

RBAC0,是最简单、最原始的实现方式,也是其他RBAC模型的基础

在该模型中,用户和角色之间可以是多对多的关系,即一个用户在不同场景下是可以有不同的角色,例如:项目经理也可能是组长也可能是架构师。同时每个角色都至少有一个权限。这种模型下,用户和权限被分离独立开来,使得权限的授权认证更加灵活

4.2 RBAC1

基于RBAC0模型,引入了角色间的继承关系,即角色上有了上下级的区别。


角色间的继承关系可分为一般继承关系受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构,实现角色间的单继承。

这种模型适合于角色之间层次分明,可以给角色分组分层。

4.3 RBAC2

RBAC2,基于RBAC0模型的基础上,进行了角色的访问控制

RBAC2中的一个基本限制是互斥角色的限制,互斥角色是指各自权限可以互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。

该模型有以下几种约束:

  • 互斥角色 :同一用户只能分配到一组互斥角色集合中至多一个角色,支持责任分离的原则。互斥角色是指各自权限互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。常举的例子:在审计活动中,一个角色不能同时被指派给会计角色和审计员角色。
  • 基数约束 :一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限;同样一个角色对应的访问权限数目也应受限,以控制高级权限在系统中的分配。例如公司的领导人有限的;
  • 先决条件角色 :可以分配角色给用户仅当该用户已经是另一角色的成员;对应的可以分配访问权限给角色,仅当该角色已经拥有另一种访问权限。指要想获得较高的权限,要首先拥有低一级的权限。就像我们生活中,国家主席是从副主席中选举的一样。
  • 运行时互斥 :例如,允许一个用户具有两个角色的成员资格,但在运行中不可同时激活这两个角色。

五、总结

RBAC模型是一种灵活的、可扩展的权限管理方式,它将权限与角色相关联,而不是直接与用户相关联。

通过定义不同的角色,并为每个角色分配相应的权限,我们可以轻松地管理用户的访问权限。这种模型不仅简化了权限管理的复杂性,还提高了系统的可维护性和可扩展性。

在本篇博客中,我们将深入探讨RBAC模型的基本概念、特点、优势以及实现方式。我们将了解如何定义角色、分配权限以及实现角色的继承和层次结构。

同时,我们还将介绍RBAC模型在实际应用中的一些挑战和解决方案,以帮助您更好地理解和应用这一模型。


 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

putty免密登录和跳转到winscp相同目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Web前端-JavaScript(Dom基础)

文章目录 1.1 DOM 介绍1.1.1 DOM简介1.1.2 DOM树 1.2. 获取元素1.2.1 根据ID获取元素1.2.2 根据标签名获取元素1.2.3 其它方式获取元素1.2.4 获取特殊元素 1.3 事件基础1.3.1 事件概述1.3.2 事件三要素1.3.3 执行事件步骤1.3.4 鼠标事件 1.4 操作元素1.4.1 操作元素内容1.4.2 属…

HTML制作一个给图片压缩的网页高质量图片压缩并保存到本地

请各位自己创建index.html文件并将一下代码复制到文本中。配合下方下载的插件共同使用&#xff08;插件需要和index.html文件放到同一个文件夹&#xff09; 点我查看演示站 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8&…

1979 年至今的每日地面气象数据AgERA5 (ECMWF) 数据集

AgERA5 (ECMWF) 数据集 1979 年至今的每日地面气象数据&#xff0c;作为农业和农业生态研究的输入。该数据集基于地表每小时 ECMWF ERA5 数据&#xff0c;称为 AgERA5。原始ERA5数据的采集和预处理是一项复杂且专业的工作。通过提供 AgERA5 数据集&#xff0c;用户可以从这项工…

143.【Nginx-02】

Nginx-02 (五)、Nginx负载均衡1.负载均衡概述2.负载均衡的原理及处理流程(1).负载均衡的作用 3.负载均衡常用的处理方式(1).用户手动选择(2).DNS轮询方式(3).四/七层负载均衡(4).Nginx七层负载均衡指令 ⭐(5).Nginx七层负载均衡的实现流程 ⭐ 4.负载均衡状态(1).down (停用)(2)…

Pixelmator Pro 中文

Pixelmator Pro是一款专为Mac用户设计的强大图像编辑软件。它提供了丰富的功能和直观的界面&#xff0c;使用户可以轻松进行各种图像处理任务。该软件支持各种文件格式&#xff0c;包括JPEG、PNG、GIF、BMP和TIFF等&#xff0c;并可导入Photoshop的psd文件。它提供了丰富的绘画…

设计模式----解释器模式

一、简介 解释器模式使用频率并不高&#xff0c;通常用来构建一个简单语言的语法解释器&#xff0c;它只在一些非常特定的领域被用到&#xff0c;比如编译器、规则引擎、正则表达式、sql解析等。 解释器模式是行为型设计模式之一&#xff0c;它的原始定义为&#xff1a;用于定义…

SSTI模板注入基础(Flask+Jinja2)

文章目录 一、前置知识1.1 模板引擎1.2 渲染 二、SSTI模板注入2.1 原理2.2 沙箱逃逸沙箱逃逸payload讲解其他重要payload 2.3 过滤绕过点.被过滤下划线_被过滤单双引号 "被过滤中括号[]被过滤关键字被过滤 三、PasecaCTF-2019-Web-Flask SSTI参考文献 一、前置知识 1.1 模…

Linux(一)Linux理论

文章目录 一、Linux概述1.1 体系结构1.1.1 Linux内核1.1.2 用户态与内核态1.1.3 交换空间1.1.4 CLI和GUI 1.2 开机启动过程1.3 系统运行级别1.4 Linux进程1.4.1 Linux进程通信的方法1.4.2 Linux进程状态 二、文件2.1 Linux文件系统2.2 目录结构2.3 绝对路径和相对路径2.4 日志文…

刷题第五十一天 84. 柱状图中最大矩形

好难&#xff0c;看解析&#xff1a; # 双指针 class Solution:def largestRectangleArea(self, heights: List[int]) -> int:size len(heights)# 两个DP数列储存的均是下标indexmin_left_index [0] * sizemin_right_index [0] * sizeresult 0# 记录每个柱子的左侧第一…

量化投资策略的评估标准及其计算公式

收益率指标&#xff1a;分为策略的总收益率和策略的年化收益率 策略的总收益率&#xff1a; 策略的总收益率是评价一个策略盈利能力的最基本的指标&#xff0c;其计算方法为&#xff1a; 公式中Vt表示策略最终的股票和现金的总价值&#xff0c;V0表示策略最初的股票和现金的总…

prometheus二进制安装

1、在需要安装prometheus的目录下执行wget命令下载软件到本地&#xff0c;如我的路径是/opt/module/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz正在解析主机 objects.githubusercontent.com …