权限系统设计之RBAC

682 阅读5分钟

ACL的短板

在上一期介绍完ACL(访问控制列表)之后,我们知道 用户权限 之间是多对多的关系。

假设一个图书管理系统的某些用户拥有【上传书籍】和【查阅书籍】的权限,由于业务变更,现在需要收回这些人的【上传书籍】权限,仅保留【查阅书籍】的权限。

这个时候,需要在数据库中删除这 N 条 用户-权限 数据;倘若后续又要加回来,又得将这 N 条数据一条一条的挨个加回来。属实麻烦,且不易操作。

那么有没有一种权限系统模型,可以批量的管理一批权限呢?

接下来介绍的RBAC模型就可以完美的解决这个问题。

RBAC介绍

将一组权限打包分配给某一类用户,这一类用户拥有的是这个 权限包 所包含的全部权限,当该权限包删除【上传书籍】的权限时,这一类用户均失去这条权限;当该权限包增加【上传书籍】的权限时,这一类用户均获得这条权限。

将权限包换一个名字:角色(Role) 。便有了RBAC模型。

RBAC:Role-Based Access Control,基于角色的访问控制。

通过引入 角色 这一概念,将用户和权限解耦,来满足权限的批量管理。

同时,角色的概念也更符合生活中的各种场景,例如一个网站只有管理员才拥有编辑和查看的权限,而普通的访问者仅拥有查看的权限。

这里的管理员和访问者便是两个角色。

用户拥有哪些权限,取决于该用户是什么角色。

举例

还是拿图书管理系统来举例:针对每一本书,有四条权限,分别是:【新增】、【删除】、【编辑】和【查看】。

有两个用户:张三 和 李四。张三是管理员,拥有全部权限;李四是访问者,仅拥有【查看】权限。

实现最简单的RBAC系统一共需要五张表:三张信息表和两张关系表。

三张信息表分别是:用户信息表、角色信息表和权限信息表。这里不做展开。

两张关系表:用户-角色关系表、角色权限关系表。如下所示:

用户-角色关系表

用户角色
张三管理员
李四访问者

角色-权限关系表

角色权限
管理员新增
管理员删除
管理员编辑
管理员查看
访问者查看

授权

这两张关系表就很明显的展现的RBAC的授权方式,通过给用户分配不同的角色,来改变其拥有的权限。

管理员拥有:【新增】、【删除】、【编辑】和【查看】四种权限。

访问者拥有:【查看】一种权限。

假设新注册的一个用户 王五,通过给王五分配管理员的角色,王五就拥有了四条权限。

在RBAC中只需要在 用户-角色关系表 中增加一行数据,而在ACL中则需要增加四条数据,才可以达到相同的授权效果。

鉴权

鉴权流程也非常简单,调用方传入用户和权限信息,权限系统通过 用户角色关系表 以及 角色权限关系表 便可轻松判断。

权限变更

在权限变更方面,相较于ACL,RBAC的优势更加明显。

在RBAC中想收回 访问者 的【查看】权限,只需要在 角色-权限关系表 中删除对应的一条数据即可;而在ACL中甚至无法区分用户拥有的【查看】权限是否应该被收回,因为无法区分它是来自于什么角色。

同理,给用户批量增加权限也很简单,只需要给对应的 角色 增加对应的权限即可。

总结

本文介绍的是最简单的RBAC0模型,也是目前市面上最常用的权限模型基础,后面还有RBAC1、RBAC2和RBAC3模型的介绍,将全部集中在下一篇文章当中。敬请期待!

优点

  1. 更符合生活场景,一个用户拥有什么权限,取决于角色。
  2. 权限管理更为方便,通过引入角色的概念,将用户与权限解耦。对于批量用户的权限调整,只需要调整对应的角色权限关系即可。在大幅提升效率的同时,又降低了直接操作用户权限的错误风险。

缺点

  1. 在大部分的生活场景中,用户的角色决定了用户的权限。但在复杂的业务场景中,同一个角色在不同的情况下拥有不同的权限。
  2. 假设还有一个比 管理员 这个角色权限还多的角色:超级管理员。那么就需要在 角色表和角色-权限关系表中增加 超级管理员 的数据。并且,每当有一个新的权限出现时,都需要手动的绑定给 管理员 和 超级管理员。在这类管理员角色数量变得越来越多时,RBAC0模型的人力维护成本就很大了。这个缺点将在明天更的RBAC1模型中介绍解决方案。
  3. 角色爆炸是一个很常见的问题,由于业务场景的复杂性,RBAC模型很容易出现角色爆炸的现象,即角色数量增长到一个无法维护的级别。一般出现角色爆炸的场景,都会转为考虑ABAC的权限模型。这个也会在后面介绍到。