【设计模式】RBAC 模型详解

简介: 随着软件系统的复杂性和规模的不断增长,权限管理成为了一个至关重要的问题。在大型多人协作的系统中,如何有效地管理不同用户的访问权限,确保系统的安全性和稳定性,是每一个开发者都需要面对的挑战。为了解决这一问题,业界提出了一种被广泛应用的权限管理模型——基于角色的访问控制(Role-Based Access Control,简称RBAC)。希望通过本篇博客的学习,您能够深入了解RBAC模型的核心思想和实现原理,掌握如何在实际项目中应用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)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。

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

image.gif编辑

RBAC的基本概念:

    1. 角色(Role):角色是一组权限的集合,代表了在组织内执行特定任务或职责的用户群体。例如,“管理员”、“编辑”和“访客”等。
    2. 用户(User):系统中的实际用户,他们被分配到一个或多个角色,从而获得相应的权限。
    3. 权限(Permission):权限定义了用户可以对系统资源执行的操作,如“读取”、“写入”或“删除”等。
    4. 会话(Session):用户通过身份验证后建立的与系统之间的连接,会话中用户的角色和权限将被激活。

    RBAC的优势:

      1. 简化权限管理:通过角色分配权限,管理员无需为每个用户单独配置权限,降低了管理复杂度。
      2. 提高安全性:RBAC可以实施最小权限原则,即只授予用户完成任务所需的最小权限,从而降低潜在的安全风险。
      3. 支持灵活扩展:随着组织的发展和变化,可以轻松添加新的角色和权限,以满足不断变化的需求。
      4. 提高合规性:RBAC有助于满足许多法规和合规性要求,如GDPR、HIPAA等。

      以下是一个简单的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

      image.gif

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

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

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

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


        二、RBAC 的组成

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

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

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

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

          image.gif编辑


          三、RBAC 的优缺点

          3.1 优点

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

            3.2 缺点:

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

              四、RBAC 的 3 种模型

              4.1 RBAC0

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

              image.gif编辑

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

              4.2 RBAC1

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

              image.gif编辑

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

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

              4.3 RBAC2

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

              image.gif编辑

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

              该模型有以下几种约束:

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

                五、总结

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

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

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

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



                目录
                相关文章
                |
                6月前
                |
                设计模式 人工智能 自然语言处理
                【设计模式】MVVM模式在AI大模型领域的创新应用
                【设计模式】MVVM模式在AI大模型领域的创新应用
                83 0
                |
                7月前
                |
                设计模式 前端开发 安全
                C++23种设计模式&软件设计模型
                C++23种设计模式&软件设计模型
                |
                设计模式 安全 Java
                设计模式总结(一):创建型模型
                设计模式总结(一):创建型模型
                107 1
                |
                设计模式 领域建模 数据库
                提升代码质量的方法:领域模型、设计原则、设计模式
                提升代码质量的方法:领域模型、设计原则、设计模式
                |
                设计模式 存储 前端开发
                Python:设计模式之模型-视图-控制器-MVC复合模式
                Python:设计模式之模型-视图-控制器-MVC复合模式
                101 0
                |
                设计模式 安全 Java
                java 设计模式实战,原始模型模式之写作业,克隆以后就是新的
                通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象。 这让我不由自主的想起克隆技术,还记得克隆羊吗?
                java 设计模式实战,原始模型模式之写作业,克隆以后就是新的
                |
                设计模式 存储 前端开发
                Python:设计模式之模型-视图-控制器-MVC复合模式
                Python:设计模式之模型-视图-控制器-MVC复合模式
                147 0
                |
                设计模式 Kubernetes Java
                提升代码质量的方法:领域模型、设计原则、设计模式
                我们可以列举出非常多质量差的代码的表现现象,其中最影响代码质量的两个表现是命名名不副实、逻辑可扩展性差,当一个新人阅读代码时,有时发现方法命名与实际逻辑对不上,这就让人感到非常疑惑,这种现象在平时工作并不少见;另一个就是逻辑扩展性差,一个新业务需求提出来后,发现要在多处改动,需要回归的业务逻辑比较多,造成研发效率不高。
                提升代码质量的方法:领域模型、设计原则、设计模式
                |
                设计模式
                akka设计模式系列-消息模型
                  通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式。随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程。actor之间消息设计的是否合理,往往意味着Akka应用设计的是否合理。
                2384 0
                |
                Java 设计模式 安全
                akka设计模式系列(Actor模型)
                  谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做《A Universal Modular Actor Formalism for Artificial Intelligence 》的论文,它最早发表于1973年,提出了一种并发计算的理论模型,Actor就源于该模型。
                8303 0