我们在开发一个系统的时候,或多或少都会涉及到用户权限的问题。例如在企业系统中,不同部门、不同职位的人所拥有的权限是不同的,同样在收费产品里面,付费用户和免费用户权限也不一样。
之前在设计用户和权限的关系时,我们都是凭感觉设计的,但牛顿曾说:站在巨人的肩膀上,会让我们看的更远。所以我们在设计时不妨参考目前比较成熟的权限控制模型 ---- RBAC(Role-Based Access Control)权限模型。
RBAC模型表结构示例
接下来,本文就对 RBAC 权限模型做一个简单介绍。
什么是 RBAC 模型
RBAC(Role-Based Access Control),即基于角色的权限控制。通过用户关联角色,角色关联权限的方式间接赋予用户权限。
有人会问为什么不直接将权限赋值给用户,中间要增加角色这一环节?
其实是可以直接为用户分配权限的,但是这样就少了一层关系,扩展性弱了很多,适合哪些用户数量、角色类型少的平台。
一般的系统中,都会存在多个用户拥有相同权限的情况,在分配的时候,就需要分别给不同的用户指定权限,后续权限更新也是个麻烦事儿。而使用角色,我们只需修改角色对应的权限,然后将相同权限的用户指定为同一个角色即可,大幅提升了权限调整的效率。
RBAC 模型的分类
RBAC 模型可以分为:RBAC0、RBAC1、RBAC2、RBAC3 这四类。其中 RBAC0 是基础,也是最简单的,相当于底层逻辑,RBAC1、RBAC2、RBAC3都是基于 RBAC0 的升级。
一般产品,只需基于 RBAC0 就可以满足权限管理系统的设计了。
RBAC0
最简单的用户、角色、权限控制模型。具体来说可以分为下面两种:
- 用户与角色是一对多的关系:即一个用户对应一个角色,一个角色可对应多个用户。
- 用户与角色是多对多的关系:即一个用户可对应多个角色,一个角色也可以对应多个用户。
举例:
例如一批校招员工刚入公司,可以统一分配临时员工角色,当培训结束通过考核后,批量修改为正式员工的角色。
RBAC1
与 RBAC0 相比,增加了子角色,引入了继承的概念,即子角色可以继承父角色的所有权限。简单理解就是给角色分几个等级,每个等级权限不同(不超出父角色的权限范围),从而实现更细度的权限管理。
举例:
例如工程师的角色,有一级工程师、二级工程师等等,每个级别的工程师所拥有的权限是不同的,所以我们就可以将工程师这个角色分等级,根据其级别分配。
RBAC2
RBAC2 在 RBAC0 的基础上,增加了对用户、角色、权限的一些限制。这些限制可以分成两类,即静态职责分离 SSD(Static Separation of Duty)和动态职责分离 DSD(Dynamic Separation of Duty)。
静态职责分离:
- 角色互斥:同一用户不能分配到两个互斥角色中。互斥角色是指权限相互制约的两个角色。例如:财务系统中一个用户不能同时拥有会计角色和审计员角色。
- 基数约束:一个用户拥有的角色数量是有限的,一个角色拥有的权限数量也是有限制的。例如:一个角色专门为保密人员创建的,那这个角色的数量时有限的。
- 先决条件限制:用户想要获得较高的权限,必须先拥有低一级的权限。例如:先拥有副总经理权限,才能有总经理权限。
动态职责分离:
- 运行时互斥:允许一个用户具有两个角色,但运行时只能激活其中一个角色。
RBAC3
RBAC3 也称为统一模型,它包含了 RBAC1 和 RBAC2 的所有特性,这里就不多赘述了。
基于RBAC的延展——用户组
基于RBAC模型,还可以适当延展,使其更适合我们的产品。例如增加用户组概念,直接给用户组分配角色,再把用户加入用户组。这样用户除了拥有自身的权限外,还拥有了所属用户组的所有权限。
用户组概念可以很方便的给群体用户授权,且不影响用户原有的权限。
举例:
例如,我们可以把一个部门看做一个用户组,然后给部门赋予角色,这样就有了部门权限,这个部门下面的所有员工就都拥有了部门权限。
感谢大家读到这里,后续还会有其他相关文章,欢迎继续阅读。