RBAC 权限设计(二)

一、简述

本文正式介绍 RBAC 模型是如何解决权限问题的。

二、RBAC 模型

RBAC(Role-Based Access Control,基于角色的访问控制)是一种访问控制模型,其核心概念是基于角色的权限分配。在 RBAC 模型中,通过让权限与角色关联来实现授权,给用户分配一系列的角色来让注册用户得到这些角色对应的权限,使系统权限分配更加方便。
RBAC 模型可以分为四种:

  1. RBAC0:最简单的用户、角色、权限模型。用户和角色,角色和权限都是多对多的关系。用户拥有的权限等于他所有的角色持有权限之和。
  2. RBAC1:相对于 RBAC0 模型,增加了子角色,引入了继承概念,即子角色可以继承父角色的所有权限。
  3. RBAC2:基于 RBAC0 模型,增加了对角色的一些限制:角色互斥、基数约束、先决条件角色等。
  4. RBAC3:称为统一模型,它包含了 RBAC1 和 RBAC2,利用传递性,也把 RBAC0 包括在内,综合了 RBAC0、RBAC1 和 RBAC2 的所有特点。

三、RBAC0

RBAC0 是RBAC(基于角色的访问控制)模型中最基础的模型。在 RBAC0 模型中,我们把权限赋予角色,再把角色赋予用户。用户和角色,角色和权限都是多对多的关系。用户拥有的权限等于他所有的角色持有权限之和。
例如,我们做一款企业管理产品,如果按传统权限模型,给每一个用户赋予权限则会非常麻烦,并且做不到批量修改用户权限。这时候,可以抽象出几个角色,譬如管理员、普通用户等,然后把权限分配给这些角色,再把角色赋予用户。这样无论是分配权限还是以后的修改权限,只需要修改用户和角色的关系,或角色和权限的关系即可,更加灵活方便。
在这里插入图片描述

四、RBAC1

RBAC1 是 RBAC(基于角色的访问控制)模型中的一种,它在 RBAC0 的基础上引入了角色间的继承关系。简单来说,就是给角色分成几个等级,每个等级的权限不同,从而实现更细粒度的权限管理。
例如,我们可以把一个公司的销售经理看作一个角色,销售经理又可以分为高级销售经理和初级销售经理,这两个角色就形成了一个等级关系。高级销售经理拥有的权限包括自己的权限和初级销售经理的所有权限,这就是角色的继承关系。
在这里插入图片描述

五、RBAC2

RBAC2 是 RBAC(基于角色的访问控制)模型中的一种,它在 RBAC0 的基础上,对用户、角色和权限三者之间增加了一些限制。这些限制可以分成两类,即静态职责分离 SSD (Static Separation of Duty) 和动态职责分离DSD (Dynamic Separation of Duty)。
例如,有些角色之间是需要互斥的,譬如给一个用户分配了销售经理的角色,就不能给他再赋予财务经理的角色了,否则他即可以录入合同又能自己审核合同。
在这里插入图片描述

六、RBAC3

RBAC3 是 RBAC(基于角色的访问控制)模型中的一种,它是 RBAC1 和 RBAC2 的合集。也就是说,RBAC3 既有角色分层(RBAC1的特性),也包括可以增加各种限制(RBAC2的特性)。
这意味着在 RBAC3 模型中,你可以设置角色的等级,并且可以对用户、角色和权限之间增加一些限制,如静态职责分离(SSD)和动态职责分离(DSD)。所以 RBAC3 模型可以满足更复杂的业务需求。
在实际的互联网应用中,大多数场景下 RBAC3 能满足业务需求。然而,只有在系统对权限要求非常复杂时,才考虑使用 RBAC3 权限模型。
在这里插入图片描述

七、一点思考

在上文中,我尽可能的简化了 RBAC 各种模型的描述,但是当描述 RBAC3 模型时依旧可以发现权限设计的高复杂度。所以权限设计并非是一个简单的话题。RBAC 的各种模型是帮助我们应对不同的业务场景的,所以并不是每一个系统的权限设计都需要按照最完善的模型去设计,这会导致过度设计浪费不必要的资源,同时也会增加整个系统的复杂度。所以,在考虑权限设计时需要做一定的权衡取舍。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 13:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 13:04:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 13:04:01       82 阅读
  4. Python语言-面向对象

    2024-04-04 13:04:01       91 阅读

热门阅读

  1. ES6模块与CommonJs模块异同

    2024-04-04 13:04:01       31 阅读
  2. git已经commit的怎么合并信息再push

    2024-04-04 13:04:01       42 阅读
  3. 前端查询前校验该输入的字段是否能够进行查询

    2024-04-04 13:04:01       35 阅读
  4. C++多态

    C++多态

    2024-04-04 13:04:01      31 阅读
  5. 【Vue.js 3.0】NProgress 进度条

    2024-04-04 13:04:01       46 阅读
  6. html中的div标签

    2024-04-04 13:04:01       39 阅读
  7. mvn怎么安装jar

    2024-04-04 13:04:01       43 阅读
  8. Python零基础教学(if条件判断·1)

    2024-04-04 13:04:01       44 阅读
  9. MetaGPT部分源码解读--Role

    2024-04-04 13:04:01       36 阅读
  10. Linux 网络: 网卡速度异常案例(1)

    2024-04-04 13:04:01       31 阅读
  11. 服务器硬件基础知识

    2024-04-04 13:04:01       34 阅读
  12. excel怎么快速去掉多个空行

    2024-04-04 13:04:01       36 阅读
  13. 网络安全包括哪些方面?

    2024-04-04 13:04:01       38 阅读
  14. Linux Shell文件描述符和重定向

    2024-04-04 13:04:01       39 阅读
  15. vue2升级到vue3的一些使用注意事项记录(二)

    2024-04-04 13:04:01       37 阅读
  16. 软件设计原则:里氏替换原则

    2024-04-04 13:04:01       35 阅读