DMP作为一个大数据管理平台,使用平台的人员众多,使用DMP系统目的可能会有所区别,有的人需要制作报告,有的只需要阅读报告。阅读报告时,不同的人看到的数据也会有所区别,例如:北京公司的财务和深圳公司的财务看到的财务报告是不同的。DMP系统提供的强大的权限系统来灵活的给使用者分配角色,安全高效的使用DMP。
谈到权限控制的设计,需要先理清楚定义和原理。所以我们需要看到权限控制中本质,也就是说控制的是什么?其实是:用户与可以进行的行为的关联关系。这句话中有3个关键词:用户、行为、关联关系。那么,权限系统维护的是用户和可进行行为的关联关系。
上面的话有点不好理解,你就按照用户画像那么理解,在权限系统里,每个用户身上打满了一堆可以进行行为的标签。
那么权限控制系统的原理呢? 其实很简单,就是: 用户在访问时,通过了解用户具有的可以进行的行为的集合,决定用户可以看到什么菜单,以及在什么菜单下能使用什么功能,并且具备什么样操作数据的能力。讲完基本原理,下面介绍下在计算机世界中经典的权限模型-----RBAC。
RBAC权限模型(Rose base Access Controller), 基于角色的访问控制。
RBAC中有3个概念,用户(users)、角色(Roles)、权限(Permissions)。这里对比上面权限基本原理,多引入了一个角色的概念。大家可以想想为什么要引入这个角色的概念?图中可以看出,RBAC对资源授权管理过程分为两个部分,首先实现访问权限与角色相关联,然后再实现角色与用户相关联,从而实现了用户与访问权限的逻辑分离。用户通过成为适当角色成员而得到这些角色的权限。
依据RBAC模型思想,DMP中权限系统设计分为用户管理和权限管理两部分,用户管理主要指管理以及为员工指派角色,权限管理主要指管理菜单、页面、按钮、数据权限等资源,通过定义最基本的业务功能点作为权限点,实现管理角色对资源主体的请求,构成“用户-角色-权限-资源”的授权模型。模型中权限这个元素,按颗粒度从大到小,可以分为:
用户登录系统之后,前端需要向后端请求菜单接口,就是该用户能访问什么菜单。这时候,权限系统从所有的菜单中过滤出当前用户有查看权限的菜单。DMP中设计了两张表,一个是function(功能表),func_action(功能操作表)。将菜单抽象为一种资源。
设计好功能表后,就需要设计,角色跟功能直接的关系表,类似这样
获取菜单的流程如下:
仅靠菜单控制是不安全的,因为用户可能直接通过url访问网页、访问按钮接口。API校验是除了菜单渲染外另一道权限控制的保障。
通过卡门(API网关)的API请求转发到具体业务系统时,会首先通过权限校验对该角色是否具有权限访问这个API进行判定,若权限校验通过则执行后面业务逻辑。
例如:当一个用户打开一个发布报告的链接时,判断是否有权限。
按钮的控制,前端还需要根据后端的返回控制按钮的显示。例如:一个报告阅读者,打开报告列表时,不应该有报告的编辑、发布按钮等。
实现的方式是,后端返回对象数据中,添加一个actions的属性,表示当前用户可以对该对象进行的操作,结构如下:
前端展示的时候如下图:
如果后端返回的actions为空时,前端只会显示一个预览的按钮。(如果连查看权限都没有的话,后端不会返回这个对象的数据)
DMP作为大数据平台,对数据的权限控制是比较灵活的。例如:同家公司,打开同一个报告,不同区域的人看到的数据是不一样的。北京的财务和深圳的财务看到的报告数据是不一样的。讲下大致的配置方案:
1.新增两个角色,分别是北京区域,深圳区域。
2.在北京区域这个角色中,添加北京财务这个用户。深圳区域同理。
3.为北京区域这个角色数据权限
4.制作报告,引用这个数据集。
5.报告中单图显示查询时,在最后取数的接口上,添加数据权限过滤。查询当前单图有没设置数据权限。有设置的话会在原有的查询sql语句中添加where条件。例如:本来的查询语句是这样的
select `区域`, `总利润` from `财务报表数据集`;
加上数据权限的过滤后变成:
select `区域`, `总利润` from `财务报表数据集` where `区域`='北京';
达到数据权限控制的效果。
其实上面说的只是RBAC0,还有RABC1、RABC2和RABC3,都是基于RABC0进行的一些拓展,虽然目前DMP还没使用,不排除未来会使用或者阅读这篇文章的同学会使用,简单说下他们的思想。
在角色中引入了继承的概念。简单理解就是,给角色可以分成几个等级,每个等级权限不同,从而实现更细粒度的权限管理。
例如:一个公司的销售经理可能是分几个等级的,譬如除了销售经理,还有销售副经理,而销售副经理只有销售经理的部分权限。
RBAC2对用户、角色和权限三者之间增加了一些限制。
这些限制可以分成两类,即静态职责分离SSD(Static Separation of Duty)和动态职责分离DSD(Dynamic Separation of Duty)。具体限制如下图:
RBAC3,它是RBAC1与RBAC2合集,所以RBAC3是既有角色分层又有约束的一种模型。就不举例了。