权限管理是B端中常见的话题,它规定了用户各自的角色和可使用的职能,也对数据的安全提供了保障。
权限管理是B端产品绕不开的话题,本文总结了我对权限管理的设计经验与设计方法,共分为4个部分:
- 权限管理的概念梳理
- RBAC权限设计的一般步骤
- 设计功能权限的三板斧:基础版(权限、角色、用户管理)、进阶版(部门、职位、菜单管理)、拓展(版本管理)
- 如何设计数据权限
所有内容均根据自身思考实践及经验借鉴而来,如有错误欢迎指正。
第一章:权限管理的概念梳理
一、权限是什么
权限包括了功能权限和数据权限:
功能权限是系统执行权限控制的基本单元,包括页面权限、菜单权限、按钮权限等
数据权限包括基础数据、业务数据、资源数据等
针对功能模块划分用户权限是一种粗颗粒度的划分方式,表现在不同用户可以查看相同的数据,但可执行的操作不同,如线上数据库的数据只有超管可以删除,其他人只能查看;针对数据划分用户权限是一种细颗粒度的划分方式,表现在不同用户进入同一页面/菜单时,可见的数据有差异,如运营经理可以看到部门所有数据,运营人员只能看到自己创建的数据。做权限设计时,首先要分清功能权限和数据权限的界限,不要为了图方便将二者揉起来。
二、为什么需要权限管理
- 岗位职责的需要
- 数据安全的需要
三、权限设计的核心思想
权限管理是用来控制用户可以访问而且只能访问某些资源的系统,根据该定义,我们可以绘制出如下示意图:
可以看出,用户和资源形成了错综复杂的映射关系,很难管理。要解决这一问题,有两种方法:一是减少用户/资源数,显然不切实际,这样就只剩下了一种方法——减少映射关系。
在详细介绍该方法前,我们先来看看数据库中是如何解决查询慢的问题的。大家可以思考一个问题,在【35、27、48、12、29、38、55】这组数列中如何快速找到数字55?
大部分人的第一反应就是一个个遍历,这样一共需要查询7次。而对数据库工程师来说,首先会找到一个媒介来构建这组数列的表示关系(见下图-平衡二叉树),然后再通过简单的判断只用3次就可以找到55了。这个媒介就是数据库中的索引,在数据量巨大的时候,利用索引进行查询的优势十分明显。
如果这个例子不好理解,大家还可以联想下字典中的索引、书籍中的目录或是图书馆中的书架标签,核心思想都是抽象出对象的公共属性,再进行分类管理。
利用这一思想,我们再来回看如何减少用户和资源的映射关系。
- 判断用户与用户之间是否有公共属性?
- 找到对权限有影响的公共属性,比如部门、职位等
- 不断抽象出中间媒介
对于资源也是同理。
经过以上步骤,原本杂乱无章的映射关系就变得既简约又有层次(见下图),我们只要把权限赋予到抽象出来的虚拟媒介上,就能够大大降低管理的复杂程度。
四、权限管理模型的演进
了解了权限设计的核心思想后,我们以CMS系统的更新为例来阐述权限管理模型的演进。
1. ACL:基于用户的权限管理模型
小王是一家创业公司的产品经理,负责一款CMS系统的设计。起初,网站的所有内容都由公司唯一的运营小红负责,所以小王就对小红的账号开启了所有权限。
这种直接将权限绑定在用户账号上的方式就叫做基于用户的权限管理(ACL)。
2. RBAC:基于角色的权限管理模型
随着运营部门不断发展壮大,每次有新员工入职,小王都要为其单独配置权限,而且无法批量修改,十分繁琐。同时小王发现运营部门分工明确,部分人员负责内容审核,需要为他们开启审核管理的权限;部分人员负责产出内容,需要为他们开启内容管理的权限……这就导致小王经常会做一些重复性的工作。于是小王就想在现有的用户层上再抽象出一层——角色层,只要对角色设置权限,属于该角色的人员就自动拥有这些权限。
这种将权限绑定在角色上,再给用户账号赋予角色的方式就叫做基于角色的权限管理(RBAC),该模型于1992年由美国国家标准与技术研究院组织开发,是目前最通用的权限管理模型,节省了很大的权限维护成本。
GerorgeMason大学的教授Ravi Sandhu于1996年对RBAC模型进行改进,提出了RBAC96模型族,包括RBAC0、RBAC1、RBAC2和RBAC3四个模型。上图代表RBAC0模型,也是其他3个模型的基础。
a. RBAC1:角色继承的RBAC模型
在CMS系统使用了一段时间后,小王发现了一个新问题——系统中存在的角色太多了,因为只要有权限不一样的用户加入系统,就需要新建一个角色,当用户权限分得很细的时候,甚至比ACL还繁琐,于是小王就想着手解决这一问题。
点他发现角色之间存在着类似组织架构一样的上下级关系,比如COO>运营经理>运营主管>运营组长>运营人员>运营实习生,并且上级拥有下级的所有权限,同时可以额外拥有其他权限,于是他在现有的角色基础上又抽象出一层角色等级。
这种在角色中引入上下级关系的RBAC模型就叫做角色继承的RBAC模型(RBAC1),通过给角色分级,高级别的角色可继承低级别角色的权限,一定程度上简化了权限管理工作。
另外角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系要求角色继承关系是一个绝对偏序关系,允许角色间的多向继承,即下级角色可以拥有多个上级角色,上级角色也可以拥有多个下级角色。而受限继承关系则要求角色继承关系是一个树状结构,角色间只能单向继承,即下级角色只能拥有一个上级角色,但是上级角色可以拥有多个下级角色。
b. RBAC2:角色限制的RBAC模型
过了一段时间,运营经理小红向小王反馈,她的账号竟然可以看到公司的财务账单,经过核查,是小王由于粗心导致给小红的账号多