在我的项目理论开发中咱们不光要管制一个用户能拜访哪些资源,还须要管制用户只能拜访资源中的某局部数据。
管制一个用户能拜访哪些资源咱们有很成熟的权限治理模型即 RBAC,然而管制用户只能拜访某局部资源(即咱们常说的数据权限)应用 RBAC 模型是不够的,本文咱们尝试在 RBAC 模型的根底上融入数据权限的管理控制。
首先让咱们先看下 RBAC 模型。
RBAC 模型
RBAC 是 Role-BasedAccess Control 的英文缩写,意思是基于角色的访问控制。
RBAC 当时会在零碎中定义出不同的角色,不同的角色领有不同的权限,一个角色实际上就是一组权限的汇合。而零碎的所有用户都会被调配到不同的角色中,一个用户可能领有多个角色。应用 RBAC 能够极大地简化权限的治理。
RBAC 模型还能够细分为 RBAC0,RBAC1,RBAC2,RBAC3。这里咱们不探讨他们之间的差别,感兴趣的同学能够自行钻研,咱们次要聚焦于常见的 RBAC0 模型上。
如下图就是一个经典 RBAC0 模型的数据库设计。
在 RBAC 模型下,零碎只会验证用户 A 是否属于角色 RoleX,而不会判断用户 A 是否能拜访只属于用户 B 的数据 DataB。这种问题咱们称之为“程度权限治理问题”。
数据权限
列表数据权限,次要通过数据权限管制行数据,让不同的人有不同的查看数据规定;要实现数据权限,最重要的是须要形象出数据规定。
数据规定
比方咱们零碎的商机数据,须要从上面几个维度来控制数据拜访权限。
- 销售人员只能看本人的数据;
- 各大区的销售经理只能看各区域的数据(安徽大区的销售经理看安徽区域的商机数据),同理也实用于某 BG 分管领导只能看所在 BG 的商机数据;
- 财务人员只能看金额小于一万的数据。
下面的这些维度就是数据规定。
这样数据规定的几个重点因素咱们也清晰了,就是 规定字段 , 规定表达式 , 规定值,下面三个场景对应的规定别离如下:
- 规定字段:创建人,规定表达式:=,规定值:以后登录人
- 规定字段:所属大区,规定表达式:=,规定值:安徽大区
- 规定字段:销售金额,规定表达式:<,规定值:10000
规定字段配置阐明:条件表达式:大于 / 大于等于 / 小于 / 小于等于 / 等于 / 蕴含 / 含糊 / 不等于
规定值:指定值 (固定值 / 零碎上下文变量)
关联资源、用户
光有数据规定是不够的,咱们还须要把数据规定跟资源和用户进行绑定。
数据规定与资源的绑定很简略,咱们只须要建设一个两头表即可,如下图所示:
这样资源就能够关联上了数据规定。
在利用设计上咱们须要一个独自的数据规定治理性能,不便咱们录入数据规定,而后在资源管理页面(比方商机列表)上就能够抉择内置的数据规定进行资源与规定的绑定。
那么如何让不同的用户领有不同的数据规定呢?
在 RBAC 模型中,用户是通过授予不同的角色来进行资源的治理,同理咱们能够让角色在授予权限的时候关联上数据规定,这样最终在零碎上就体现为不同的用户领有不同的数据规定。
有点拗口,咱们还是按下面的例子来说。
销售人员、大区销售经理、财务人员属于不同的角色,他们都领有商机列表这个资源权限,然而在给这些角色绑定商机列表资源权限时咱们能够勾选对应的数据规定(下面曾经实现资源与数据规定的绑定)。体现在数据库设计中咱们能够在角色资源对应关系表 Role_Permission
中增加一个字段用于存储关联的数据规定,如果有多个数据规定能够应用分隔符宰割。
最终 RBAC 模型演变成如下所示的模型:
依照下面的设计咱们须要辨别各个大区治理的数据权限则须要建设不同的大区角色,如安徽大区销售经理、上海大区销售经理,而后别离给角色勾选对应的数据规定。这里就相似于 RBAC1 中的角色继承的概念了。
这样咱们就根本实现了 RBAC 与数据规定的绑定,然而咱们还有个问题就是如何在零碎中落地。
这里咱们就要借助赫赫有名的 AOP 来实现了,这篇文章只讲原理不讲实现,所以咱们只顺带提一下实现计划。
- 自定义一个数据权限的注解,比方叫
PermissionData
- 在对应的资源申请办法,比方商机列表上增加自定义注解
@PermissionData
- 利用 AOP 抓取到用户对应角色的所有数据规定并进行 SQL 拼接,最终在 SQL 层面实现数据过滤。
持续优化
在下面的设计中咱们通过给不同角色绑定不同数据规定实现了数据权限,然而思考上面一种场景:某角色须要看到的数据范畴为“所属大区为安徽大区且事业部为消费者事业部的商机数据”,在这种场景里依照咱们之前的设计须要建设两个数据规定:
- 所属大区 = 安徽大区
- 所属事业部 = 消费者事业部
而后再建设 2 个不同的角色,别离授予不同的数据规定,如果这样的场景比拟多的话很容易呈现角色爆炸的状况,所有咱们这里再抽取出 数据规定组 的概念。
一个数据规定组有多个数据规定,数据规定之间通过 AND 进行连贯,放一张利用设计图:
体现在数据库设计中就变成了如下所示:
小结
通过下面 8 张表的设计咱们实现了 RBAC 模型与数据权限的联合,当然这里还有持续优化的空间。比方这里的规定字段和规定值咱们能够抽取出对应的字典表,让数据规定表去关联这些字典字段,这样在应用层配置数据规定的时候就不须要管理员手动填写而是从字典项中去抉择了,缩小了数据规定配置出错的概率。
数据权限是一个实现绝对比较复杂的性能,这里咱们抉择的是在 RBAC 模型根底上进行扩大,如果你有更好的解决方案欢送留言通知我。