写点什么

安全领域权限模型

作者:alibeer
  • 2022 年 2 月 24 日
  • 本文字数:1964 字

    阅读完需:约 6 分钟

如果有足够、准确的输入,具备高度抽象思考的能力,能够洞察事物的本质、形式变化与手段,那么我们是有可能获得抽象的通用模型,普适于现实世界的各种实例!

下面就以安全领域的权限为例,说明如何抓住权限的核心本质,建立简洁优雅的权限模型!

那么为什么选择这个领域作为示例呢?

一是因为这个领域足够普通,只要从事 IT,都会遇到权限问题,领域知识也比较容易理解,简单地说就是看得懂听得明白。

二是因为这个领域已经足够复杂,足以说明抽象能力对建立通用模型的重要性。

现在网上产品经理或者需求分析师关于权限的功能需求与分析文章已经很多了,有的写的清晰易懂非常不错,也有一些技术架构师关于权限设计的文章,那为什么我今天还要重写这个话题呢?这篇文章重点强调的是作为一个业务架构师是如何认知权限这个问题,并将纷繁庞杂的需求统一到高度抽象简洁的模型之中。

希望看完这篇文章之后,能够对你认知模式与思维模式有所启发,因为你遇到的实际业务问题有可能比权限问题复杂十倍,但是解决思路是相通的。

所谓权限,简单地说就是一个人有权干啥事(对等说法,也就是没权做啥事,用数学语言来说就是负权限)。那这个问题是怎么产生的呢,源于社会分工嘛。人一多,事情就复杂了,所以大家得分开干,一个人负责一摊事(当然也有可能是一摊屎)然后相互协作。

这就是权限问题的本质与根源,其他都是形式与变化,细枝末节的东西!

有人马上会说:“这也太简单了,我觉得你说的好像就是正确的废话,就这谁不知道啊?!”,我跟你说哦,能把这个问题想透想明白抓住本质的人绝不简单!

(为了更精确地表达,我们后面会将自然语言翻译成 UML)

权限=一个人有权干啥或者不能干啥

正权限=能干啥;负权限=不能干啥

绝大部分软件都是定义正权限,不在正权限清单里的事情不能干。

但是从软件实现上来说也可以定义负权限,譬如法律的人权就是这么定义,法律没有禁止(不在负权限清单)的事情都可以干,在某些现实场景中也有一定的意义,具体不详细展开了。

这是现实世界的业务模型,但是我们做的是计算机软件,在计算机世界中,代表人的是用户,这是计算机对现实世界的模拟,所以转换为软件模型如下:

现实世界的人与计算机世界的用户存在某种映射关系,如下所示,这里不具体展开来讲。

而用户不仅仅代表人,也可以是外部的系统等。

如果一个小微企业业务很简单,七八个人十几条枪,事情也不多,这就是最好的模型。


企业业务发展壮大,人员越来越多,有几十号人甚至几百号人,人多了,分工就细化了,有人专门负责销售譬如销售员,有人专门负责客户譬如客服人员,一个岗位有很多人干同样的事情,按照 HR 的说法就是岗位职责都一样。同一岗位人多了,团队太大不好管理,就拆分成多个团队,就是负责的地域或者客户不同。如下所示:

如果不调整计算机模型,给几十号甚至几百号销售客服人员一一分配权限都要一条一条权限重复一遍,非常麻烦。而且如果系统增加了新的功能,每个用户都要分配一遍,也是很繁琐的事情。大白话就是一坨权限要一一分配给一堆人,这个效率太差了。

为了提高分配权限效率,我们可以从模型的两端想办法:

A.从右端权限端抽象出角色类,以映射现实世界的岗位。这就是著名的 RBAC(Role-Based Access Control)模型,也就是所谓的“基于角色的访问控制权限”。

模型调整如下:

现实世界与计算机世界的对应关系如下所示:

现实世界属于 HR 系统,计算机世界是安全系统。有些公司(尤其是互联网公司)经常进行大规模的组织结构调整,HR 系统组织人员岗位调整时,安全系统也要重新授权。当两者之间建立映射关系时,只要 HR 系统调整即可自动完成安全系统的相应调整。

B.从左端(用户端)抽象出用户组类,以映射现实世界的团队。直接对用户组分配权限,用户组的组员直接继承组的权限。如下所示:

现实世界大团队是分层级的,对应的用户组也可以建立层次关系,这里不再展开。

如果将以上两种方法结合使用,则模型如下:

通过上述两种方法综合使用,大大提高了权限分配的效率。

但是这个模型有个弊端,如果我们想对某个用户单独授予一条权限,反而画蛇添足不方便了!如果我们既要效率,又要保持灵活性,则需要进一步调整模型。

用数学语言来说,角色就是原子权限的集合,用户组就是单一用户的集合。后面我们进一步抽象权限、用户的概念,以使它既能代表原子,又能代表原子集合。如下所示:

从上图可以看出,我们关于权限的本质定义仍然保持不变。只是为了提高使用者的效率,对两端分别进行了打包而已。

当我们提高抽象层次后,一个用户的权限是其自身权限以及其继承的用户组的权限的合集,判断一个用户到底有哪些权限需要逐层展开到最底层;除了原子权限还要展开角色权限;因为有负权限,还需要判断不同角色权限之间是否存在冲突。当层次比较多时系统判断的效率较低,所以需要在完全展开之后建立用户原子权限的缓存,而这个缓存模型正是当初我们建立的极简模型!

发布于: 刚刚阅读数: 2
用户头像

alibeer

关注

资深业务架构师 2022.02.19 加入

二十年系统分析师、架构师经验,电子商务、企业数字化领域资深业务架构师,曾任职于业界最知名的电子商务公司与ERP软件公司主持业务架构分析设计,成功辅导多家特大型央企总部电子商务平台建设。

评论

发布
暂无评论
安全领域权限模型