后台基于RBAC模型的用户与权限设计

9 评论 16865 浏览 168 收藏 9 分钟

本文作者结合实际经验,跟大家谈谈后台基于RBAC模型的用户与权限是如何设计的,一起来看看~

一、项目背景

1.1 需求来源

前段时间,笔者所在公司收到了多个客户对后台权限和角色的需求。讨论发现,现有的产品后台架构并不能很好的满足用户需求,所以为了满足这些客户的需求并为之后可能存在的业务拓展打下基础,我们决定对现有产品的后台用户体系进行迭代。

1.2 需求的拆解

通过过滤需求,我们发现其实用户的需求主要是两类:

  • 是要求我们的用户体系可以承载用户多级分销的业务模式并满足各级分销之间数据权限的要求;
  • 是要求我们完善对用户权限的控制。

二、理论依据

涉及到后台用户管理系统,绕不开的概念就是权限,任何一个账号都会有自己的用例。但是多数情况下,我们对部分账号的用例会做一些限制,如果直接将这种限制加在账号上,就会产生二个问题:

  • 每个账号都要配置很麻烦;
  • 无法批量修改一类用户的权限。

所以角色的诞生就呼之欲出了,我们通过对权限集的抽象,创立了角色,通过修改角色,来达到控制拥有该角色的账号的权限修改的目的。

权限可以分为数据权限和功能权限两大类:

  • 数据权限顾名思义,就是账号能查看多少数据,如何实现A部门与B部门之间相互不能查看业务数据,这个就涉及到数据权限;
  • 功能权限按照范围以大致菜单权限和按钮权限,按照操作可以大致分为查看和编辑权限。

2.1 RBAC-0模型

2.1.1 简述

RBAC-0 模型的特点就是用户和角色是多对多的关系,同一个用户拥有多个角色的属性,我们通过组织这个概念来构建组织架构,从而实现对角色数据权限的分配。这样单个用户账号拥有的全部权限就是他所在组织的权限的累加。

2.1.2 举例

在RBAC-0模型中,A用户负责X组织的业务,B用户负责Y组织的财务工作。正常情况下,A和B自然不能查看对方的数据,但是如果有天,B由于业务需要需要协助处理X组织的财务,那我们就可以通过为B用户添加X组织的“财务”角色来实现这种需求。在业务结束后,也可以通过暂停/删除操作来管理B在X组织下的权限。

2.2 RBAC-1模型

基于RBAC-0模型,针对角色引人继承的概念,子角色可以对父角色的权限进行继承,但是子角色的权限一定小于父角色。

2.3 RBAC-2模型

相较RBAC-0系统,RBAC-2系统在用户与角色间和角色与角色之间加入了一些规则。

  • 单个角色允许分配的用户数限制,例如一个公司不可能有多无限个“董事会”角色;
  • 单个用户允许授予的角色数限制,例如单个用户不允许在一个公组织或多个组织担任无限多个职务;
  • 角色与角色有层级关系,例如想新增一个部门经理,不能用一个部门职员的账号去创建吧?
  • 角色与角色存在互斥关系,这个根据实际业务需要来做限制,例如销售不能兼任会计。

2.4 RBAC-3模型

RBAC-3模型也叫统一模型,它基于了RBAC-0,并包含了RBAC-1和RBAC-2模型的全部特点。

三、设计过程

3.1 新增账号的属性

新增账号是用户体系的最基本的功能,新增账号时需要获取账号的哪些参数决定了整个用户体系的数据维度。

这里不得不提的就是USER_ID,登录账号,昵称的概念。

USER_ID:对应的是账号在系统中唯一标识,可以不展示给用户,例如微信的open_id和union_id,一般在新增账号时由系统生成,且不可修改;

登陆账号:登录账号和USER_ID在有的系统并不一致,同一个USER_ID可能对应着多个登录账号,例如微信可以通过微信号,手机号,邮箱去登录,这里的不同登陆方式都对应这一个登陆账号,一般在新增账号时,由用户输入,且不可修改;

昵称:昵称是用户可以自由编辑操作的,由用户输入,且允许修改。

3.2 功能权限的处理方式

功能权限通过对角色的权限树进行修改来实现。在权限树种我们可以将页面权限,菜单权限和按钮权限罗列,通过筛选对应权限完成对角色功能权限的控制。

需要注意的一个问题是,权限控制的最小粒度。如果要实现每一个权限的控制,相当于每一个权限对应功能都需要做封装。大的页面和菜单权限是必备的,但是哪些按钮权限是可以封装在一起的,(比如“启用”和“暂停”一般都是成对出现的),这些是需要产品考虑的。

3.3 数据权限的处理方式

数据权限其实是角色权限的重要属性,但是由于数据范围太灵活,如果在角色加入“数据权限”tab,如果账号下的数据量较大,用户编辑数据权限的操作会很繁琐。因此,因此现在主流的后台设计都会使用“组织结构”来对应数据权限。

在系统中,我们使用了【新增组织】的方式,来处理数据权限。

3.4 对老用户的兼容

在做用户体系的重构时,老用户的账号兼容问题是产品必须考虑的部分。兼容问题也是从功能和数据两个维度去验证新的体系是否对老用户是否有影响。

四、总结

文章的内容主要是本次迭代中实际的使用场景,抱着他山之石可以攻玉的想法,参考了现有的资料,结合自己系统的实际情况,对用户体系设计做了一次小结。若有不足之处,还请大家多多沟通,共同进步。

 

本文由@幸失 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自 Unsplash ,基于 CC0 协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 你好,角色等级是怎么体现出来的?

    回复
  2. 楼主你好,以下对文中的理解与问题:
    1. 权限树是页面权限、菜单权限和按钮权限的罗列,那如果本身菜单级别就有2个层级,再加上按钮权限那这个权限树就至少3级了。
    2. 每个页面的按钮不同,是不是增加或修改一个页面都要过来修改权限树呀?
    3. 数据权限不在权限树中体现,而是通过组织实现,相当于除了角色、用户、权限之外引入了一个组织来做数据权限的管理?

    来自上海 回复
    1. 12 一起讨论吧,首先实际页面和按钮在不同系统中实际上不一定是强耦合,页面其实更多体现的是一个信息结构。我们业务中更倾向将菜单和按钮强耦合。 我举个例子,同一按钮功能的多个入口,如果我们强行将页面插入菜单或者按钮之上,就如你所说,加个页面就要调整权限树。这种显然是不合理的,所以我们尽量要锁定权限树的枝干部分(菜单),而按钮这种叶子类目是可以调整的

      回复
    2. 3 你说得对,权限可以分功能权限和数据权限,用户和权限是基础。至于角色是包涵两类权限还是只包涵功能权限,这完全取决于业务。 如果系统本身是有组织架构概念,由于组织架构本身就和数据权限息息相关,建议是角色做的简单一点,侧重功能全选,数据权限最好只做分类(只看平级,只看下级这种)。

      回复
  3. 数据权限那里,新增组织会进行什么操作呢?

    来自浙江 回复
    1. 新增组织相当于创建了一个数据隔离的小单元,可以将账号添加进该单元,这样该账号在该单元的数据就对其他账号做了数据隔离。

      来自广东 回复
    2. 数据权限可不可以详细展开讲一下呢?怎么选择数据范围之类的。之前看到的文章是页面权限优先操作权限优选于数据权限。所以一直考虑的是选好页面权限,再选择操作权限,在选择相应的数据权限。这样又特别繁琐

      来自浙江 回复
  4. “组织”在产品中的体现是什么呢?是树形的层级架构?

    来自重庆 回复
    1. 组织是“组织架构”的最小可操作性单元。

      来自广东 回复