title | category | tag | head | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
权限系统设计详解 |
系统设计 |
|
|
作者:转转技术团队
转转公司在过去并没有一个统一的权限管理系统,权限管理由各业务自行研发或是使用其他业务的权限系统,权限管理的不统一带来了不少问题:
基于上述问题,去年底公司启动建设转转统一权限系统,目标是开发一套灵活、易用、安全的权限管理系统,供各业务使用。
目前业界主流的权限模型有两种,下面分别介绍下:
基于角色的访问控制(Role-Based Access Control,简称 RBAC) 指的是通过用户的角色(Role)授权其相关权限,实现了灵活的访问控制,相比直接授予用户权限,要更加简单、高效、可扩展。
一个用户可以拥有若干角色,每一个角色又可以被分配若干权限这样,就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。
用一个图来描述如下:
当使用 RBAC模型
时,通过分析用户的实际情况,基于共同的职责和需求,授予他们不同角色。这种 用户 -> 角色 -> 权限
间的关系,让我们可以不用再单独管理单个用户权限,用户从授予的角色里面获取所需的权限。
以一个简单的场景(Gitlab 的权限系统)为例,用户系统中有 Admin
、Maintainer
、Operator
三种角色,这三种角色分别具备不同的权限,比如只有 Admin
具备创建代码仓库、删除代码仓库的权限,其他的角色都不具备。我们授予某个用户 Admin
这个角色,他就具备了 创建代码仓库 和 删除代码仓库 这两个权限。
通过 RBAC模型
,当存在多个用户拥有相同权限时,我们只需要创建好拥有该权限的角色,然后给不同的用户分配不同的角色,后续只需要修改角色的权限,就能自动修改角色内所有用户的权限。
基于属性的访问控制(Attribute-Based Access Control,简称 ABAC) 是一种比 RBAC模型
更加灵活的授权模型,它的原理是通过各种属性来动态判断一个操作是否可以被允许。这个模型在云系统中使用的比较多,比如 AWS,阿里云等。
考虑下面这些场景的权限控制:
可以发现上述的场景通过 RBAC模型
很难去实现,因为 RBAC模型
仅仅描述了用户可以做什么操作,但是操作的条件,以及操作的数据,RBAC模型
本身是没有这些限制的。但这恰恰是 ABAC模型
的长处,ABAC模型
的思想是基于用户、访问的数据的属性、以及各种环境因素去动态计算用户是否有权限进行操作。
在 ABAC模型
中,一个操作是否被允许是基于对象、资源、操作和环境信息共同动态计算决定的。
在 ABAC模型
的决策语句的执行过程中,决策引擎会根据定义好的决策语句,结合对象、资源、操作、环境等因素动态计算出决策结果。每当发生访问请求时,ABAC模型
决策系统都会分析属性值是否与已建立的策略匹配。如果有匹配的策略,访问请求就会被通过。
结合转转的业务现状,RBAC模型
满足了转转绝大部分业务场景,并且开发成本远低于 ABAC模型
的权限系统,所以新权限系统选择了基于 RBAC模型
来实现。对于实在无法满足的业务系统,我们选择了暂时性不支持,这样可以保障新权限系统的快速落地,更快的让业务使用起来。
标准的 RBAC模型
是完全遵守 用户 -> 角色 -> 权限
这个链路的,也就是用户的权限完全由他所拥有的角色来控制,但是这样会有一个缺点,就是给用户加权限必须新增一个角色,导致实际操作起来效率比较低。所以我们在 RBAC模型
的基础上,新增了给用户直接增加权限的能力,也就是说既可以给用户添加角色,也可以给用户直接添加权限。最终用户的权限是由拥有的角色和权限点组合而成。
新权限系统的权限模型:用户最终权限 = 用户拥有的角色带来的权限 + 用户独立配置的权限,两者取并集。
新权限系统方案如下图:
完成上述配置后,就可以进行用户的权限管理了。有两种方式可以给用户加权限:
这两种方式的具体设计方案,后文会详细说明。
对于权限系统来说,首先需要设计好系统自身的权限管理,也就是需要管理好 ”谁可以进入权限系统,谁可以管理其他系统的权限“,对于权限系统自身的用户,会分为三类:
新权限系统中,我们把权限分为两大类,分别是:
每个系统中设计了三个默认角色,用来满足基本的权限管理需求,分别如下:
举个栗子:授权管理员 A 可以给 B 用户添加权限,但添加的范围 小于等于 A 用户已拥有的权限。
经过这么区分,把 拥有权限 和 拥有授权能力 ,这两部分给分隔开来,可以满足所有的权限控制的场景。
上面介绍了新权限系统的整体设计思想,接下来分别介绍下核心模块的设计
把一个新系统接入权限系统有下列步骤:
其中,1、2、3 的步骤,都是在系统管理模块完成,具体流程如下图:
用户可以对系统的基本信息进行增删改查的操作,不同系统之间通过 系统编码
作为唯一区分。同时 系统编码
也会用作于菜单和数据权限编码的前缀,通过这样的设计保证权限编码全局唯一性。
例如系统的编码为 test_online
,那么该系统的菜单编码格式便为 test_online:m_xxx
。
系统管理界面设计如下:
新权限系统首先对菜单进行了分类,分别是 目录
、菜单
和 操作
,示意如下图
它们分别代表的含义是:
菜单管理界面设计如下:
菜单权限数据的使用,也提供两种方式:
角色与用户管理都是可以直接改变用户权限的核心模块,整个设计思路如下图:
这个模块设计重点是需要考虑到批量操作。无论是通过角色关联用户,还是给用户批量增加/删除/重置权限,批量操作的场景都是系统需要设计好的。
除了给其他用户添加权限外,新权限系统同时支持了用户自主申请权限。这个模块除了常规的审批流(申请、审批、查看)等,有一个比较特别的功能,就是如何让用户能选对自己要的权限。所以在该模块的设计上,除了直接选择角色外,还支持通过菜单/数据权限点,反向选择角色,如下图:
系统操作日志会分为两大类:
在新权限系统中,用户所有的操作可以分为三类,分别为新增、更新、删除。所有的模块也可枚举,例如用户管理、角色管理、菜单管理等。明确这些信息后,那么一条日志就可以抽象为:什么人(Who)在什么时间(When)对哪些人(Target)的哪些模块做了哪些操作。 这样把所有的记录都入库,就可以方便的进行日志的查看和筛选了。
至此,新权限系统的核心设计思路与模块都已介绍完成,新系统在转转内部有大量的业务接入使用,权限管理相比以前方便了许多。权限系统作为每家公司的一个基础系统,灵活且完备的设计可以助力日后业务的发展更加高效。
后续两篇:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )