权限系统设计

导读   

    DMP作为一个大数据管理平台,使用平台的人员众多,使用DMP系统目的可能会有所区别,有的人需要制作报告,有的只需要阅读报告。阅读报告时,不同的人看到的数据也会有所区别,例如:北京公司的财务和深圳公司的财务看到的财务报告是不同的。DMP系统提供的强大的权限系统来灵活的给使用者分配角色,安全高效的使用DMP。

1.简谈原理

    谈到权限控制的设计,需要先理清楚定义和原理。所以我们需要看到权限控制中本质,也就是说控制的是什么?其实是:用户与可以进行的行为的关联关系。这句话中有3个关键词:用户、行为、关联关系。那么,权限系统维护的是用户和可进行行为的关联关系。

    上面的话有点不好理解,你就按照用户画像那么理解,在权限系统里,每个用户身上打满了一堆可以进行行为的标签。权限系统设计_第1张图片权限系统设计_第2张图片 

那么权限控制系统的原理呢? 其实很简单,就是: 用户在访问时,通过了解用户具有的可以进行的行为的集合,决定用户可以看到什么菜单,以及在什么菜单下能使用什么功能,并且具备什么样操作数据的能力。讲完基本原理,下面介绍下在计算机世界中经典的权限模型-----RBAC。

2.RBAC

    RBAC权限模型(Rose base Access Controller), 基于角色的访问控制。

    权限系统设计_第3张图片

RBAC中有3个概念,用户(users)、角色(Roles)、权限(Permissions)。这里对比上面权限基本原理,多引入了一个角色的概念。大家可以想想为什么要引入这个角色的概念?图中可以看出,RBAC对资源授权管理过程分为两个部分,首先实现访问权限与角色相关联,然后再实现角色与用户相关联,从而实现了用户与访问权限的逻辑分离。用户通过成为适当角色成员而得到这些角色的权限。

 

3.DMP权限系统

    依据RBAC模型思想,DMP中权限系统设计分为用户管理和权限管理两部分,用户管理主要指管理以及为员工指派角色,权限管理主要指管理菜单、页面、按钮、数据权限等资源,通过定义最基本的业务功能点作为权限点,实现管理角色对资源主体的请求,构成“用户-角色-权限-资源”的授权模型。模型中权限这个元素,按颗粒度从大到小,可以分为:

  • 菜单:由路由控制,是否可以访问一组页面
  • 页面:是否可以访问某个页面
  • 按钮:访问某个页面时,按钮是否可以见,可否增删改查
  • 数据:页面中某个字段是否可见、是否过滤

权限系统设计_第4张图片

2.1菜单控制

    用户登录系统之后,前端需要向后端请求菜单接口,就是该用户能访问什么菜单。这时候,权限系统从所有的菜单中过滤出当前用户有查看权限的菜单。DMP中设计了两张表,一个是function(功能表),func_action(功能操作表)。将菜单抽象为一种资源。

权限系统设计_第5张图片

权限系统设计_第6张图片

设计好功能表后,就需要设计,角色跟功能直接的关系表,类似这样

权限系统设计_第7张图片

获取菜单的流程如下:

权限系统设计_第8张图片

 

2.2 API权限校验

    仅靠菜单控制是不安全的,因为用户可能直接通过url访问网页、访问按钮接口。API校验是除了菜单渲染外另一道权限控制的保障。

通过卡门(API网关)的API请求转发到具体业务系统时,会首先通过权限校验对该角色是否具有权限访问这个API进行判定,若权限校验通过则执行后面业务逻辑。

例如:当一个用户打开一个发布报告的链接时,判断是否有权限。

权限系统设计_第9张图片

 

    按钮的控制,前端还需要根据后端的返回控制按钮的显示。例如:一个报告阅读者,打开报告列表时,不应该有报告的编辑、发布按钮等。

   实现的方式是,后端返回对象数据中,添加一个actions的属性,表示当前用户可以对该对象进行的操作,结构如下:

权限系统设计_第10张图片

前端展示的时候如下图:

权限系统设计_第11张图片

如果后端返回的actions为空时,前端只会显示一个预览的按钮。(如果连查看权限都没有的话,后端不会返回这个对象的数据)

权限系统设计_第12张图片

权限系统设计_第13张图片

2.3数据权限

    DMP作为大数据平台,对数据的权限控制是比较灵活的。例如:同家公司,打开同一个报告,不同区域的人看到的数据是不一样的。北京的财务和深圳的财务看到的报告数据是不一样的。讲下大致的配置方案:

    1.新增两个角色,分别是北京区域,深圳区域。

    2.在北京区域这个角色中,添加北京财务这个用户。深圳区域同理。

    3.为北京区域这个角色数据权限

权限系统设计_第14张图片

   4.制作报告,引用这个数据集。 

   5.报告中单图显示查询时,在最后取数的接口上,添加数据权限过滤。查询当前单图有没设置数据权限。有设置的话会在原有的查询sql语句中添加where条件。例如:本来的查询语句是这样的 

select `区域`, `总利润` from `财务报表数据集`; 

加上数据权限的过滤后变成: 

select `区域`, `总利润` from `财务报表数据集` where `区域`='北京';

达到数据权限控制的效果。

4.RBAC高级

    其实上面说的只是RBAC0,还有RABC1、RABC2和RABC3,都是基于RABC0进行的一些拓展,虽然目前DMP还没使用,不排除未来会使用或者阅读这篇文章的同学会使用,简单说下他们的思想。

    4.1 RBAC1

     在角色中引入了继承的概念。简单理解就是,给角色可以分成几个等级,每个等级权限不同,从而实现更细粒度的权限管理。

     例如:一个公司的销售经理可能是分几个等级的,譬如除了销售经理,还有销售副经理,而销售副经理只有销售经理的部分权限。

   4.2 RBAC2

     RBAC2对用户、角色和权限三者之间增加了一些限制。

     这些限制可以分成两类,即静态职责分离SSD(Static Separation of Duty)和动态职责分离DSD(Dynamic Separation of Duty)。具体限制如下图:

权限系统设计_第15张图片

    4.3 RBAC3

    RBAC3,它是RBAC1与RBAC2合集,所以RBAC3是既有角色分层又有约束的一种模型。就不举例了。

你可能感兴趣的:(python,架构)