rbac模型整合数据权限(代码片段)

飘渺Jam 飘渺Jam     2023-03-13     399

关键词:

在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据。

控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC,但是控制用户只能访问某部分资源(即我们常说的数据权限)使用RBAC模型是不够的,本文我们尝试在RBAC模型的基础上融入数据权限的管理控制。

首先让我们先看下RBAC模型。

RBAC模型

RBAC是Role-BasedAccess Control的英文缩写,意思是基于角色的访问控制。

RBAC事先会在系统中定义出不同的角色,不同的角色拥有不同的权限,一个角色实际上就是一组权限的集合。而系统的所有用户都会被分配到不同的角色中,一个用户可能拥有多个角色。使用RBAC可以极大地简化权限的管理。

RBAC模型还可以细分为RBAC0,RBAC1,RBAC2,RBAC3。这里我们不讨论他们之间的差异,感兴趣的同学可以自行研究,我们主要聚焦于常见的RBAC0模型上。

如下图就是一个经典RBAC0模型的数据库设计。

RBAC0

在RBAC模型下,系统只会验证用户A是否属于角色RoleX,而不会判断用户A是否能访问只属于用户B的数据DataB。这种问题我们称之为“水平权限管理问题”。

数据权限

列表数据权限,主要通过数据权限控制行数据,让不同的人有不同的查看数据规则;要实现数据权限,最重要的是需要抽象出数据规则。

数据规则

比如我们系统的商机数据,需要从下面几个维度来控制数据访问权限。

  1. 销售人员只能看自己的数据;

  2. 各大区的销售经理只能看各区域的数据(安徽大区的销售经理看安徽区域的商机数据),同理也适用于某BG分管领导只能看所在BG的商机数据;

  3. 财务人员只能看金额小于一万的数据。

上面的这些维度就是数据规则。

这样数据规则的几个重点要素我们也明晰了,就是规则字段规则表达式规则值,上面三个场景对应的规则分别如下:

  1. 规则字段:创建人,规则表达式:= ,规则值:当前登录人

  2. 规则字段:所属大区,规则表达式:= ,规则值:安徽大区

  3. 规则字段:销售金额,规则表达式:< ,规则值:10000

数据规则
规则字段配置说明: 
条件表达式:大于/大于等于/小于/小于等于/等于/包含/模糊/不等于
规则值:指定值 ( 固定值/系统上下文变量 )

关联资源、用户

光有数据规则是不够的,我们还需要把数据规则跟资源和用户进行绑定。

数据规则与资源的绑定很简单,我们只需要建立一个中间表即可,如下图所示:


这样资源就可以关联上了数据规则。

在应用设计上我们需要一个单独的数据规则管理功能,方便我们录入数据规则,然后在资源管理页面(比如商机列表)上就可以选择内置的数据规则进行资源与规则的绑定。

「那么如何让不同的用户拥有不同的数据规则呢?」

在RBAC模型中,用户是通过授予不同的角色来进行资源的管理,同理我们可以让角色在授予权限的时候关联上数据规则,这样最终在系统上就体现为不同的用户拥有不同的数据规则。

有点拗口,我们还是按上面的例子来说。

销售人员、大区销售经理、财务人员属于不同的角色,他们都拥有商机列表这个资源权限,但是在给这些角色绑定商机列表资源权限时我们可以勾选对应的数据规则(上面已经实现资源与数据规则的绑定)。体现在数据库设计中我们可以在角色资源对应关系表 Role_Permission中添加一个字段用于存储关联的数据规则,如果有多个数据规则可以使用分隔符分割。

最终RBAC模型演变成如下所示的模型:


按照上面的设计我们需要区分各个大区管理的数据权限则需要建立不同的大区角色,如安徽大区销售经理、上海大区销售经理,然后分别给角色勾选对应的数据规则。这里就类似于RBAC1中的角色继承的概念了。

这样我们就基本实现了RBAC与数据规则的绑定,但是我们还有个问题就是如何在系统中落地。

这里我们就要借助大名鼎鼎的AOP来实现了,这篇文章只讲原理不讲实现,所以我们只顺带提一下实现方案。

  1. 自定义一个数据权限的注解,比如叫PermissionData

  2. 在对应的资源请求方法,比如商机列表上添加自定义注解@PermissionData

  3. 利用AOP抓取到用户对应角色的所有数据规则并进行SQL拼接,最终在SQL层面实现数据过滤。

继续优化

在上面的设计中我们通过给不同角色绑定不同数据规则实现了数据权限,但是考虑下面一种场景:某角色需要看到的数据范围为 “所属大区为安徽大区且事业部为消费者事业部的商机数据”,在这种场景里按照我们之前的设计需要建立两个数据规则:

  1. 所属大区 = 安徽大区

  2. 所属事业部 = 消费者事业部

然后再建立2个不同的角色,分别授予不同的数据规则,如果这样的场景比较多的话很容易出现角色爆炸的情况,所有我们这里再抽取出 数据规则组 的概念。

一个数据规则组有多个数据规则,数据规则之间通过 AND 进行连接,放一张应用设计图:


体现在数据库设计中就变成了如下所示:


小结

通过上面8张表的设计我们实现了RBAC模型与数据权限的结合,当然这里还有继续优化的空间。比如这里的规则字段和规则值我们可以抽取出对应的字典表,让数据规则表去关联这些字典字段,这样在应用层配置数据规则的时候就不需要管理员手动填写而是从字典项中去选择了,减少了数据规则配置出错的概率。

数据权限是一个实现相对比较复杂的功能,这里我们选择的是在RBAC模型基础上进行扩展,如果你有更好的解决方案欢迎留言告诉我。

End

 

 

数据权限就该这么设计,yyyds!(代码片段)

...。控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC,但是控制用户只能访问某部分资源(即我们常说的数据权限)使用RBAC模型是不够的,本文我们尝试在RBAC模型的基础上融入数据权限的管理控制... 查看详情

springsecurity----rbac权限控制模型,和权限相关知识点整理(代码片段)

SpringSecurity----RBAC权限控制模型RBAC权限模型简介RBAC的演化进程用户与权限直接关联一个用户拥有一个角色一个用户一个或多个角色页面访问权限与操作权限数据权限动态加载用户角色权限数据UserDetails与UserDetailsService接口实现User... 查看详情

rbac:基于角色的权限访问控制(代码片段)

文章目录RBAC模型概述RBAC的组成RBAC支持的安全原则RBAC的优缺点RBAC的3种模型RBAC模型概述RBAC模型(Role-BasedAccessControl:基于角色的访问控制)模型是20世纪90年代研究出来的一种新模型,但其实在20世纪70年代的多用... 查看详情

rbac权限验证(代码片段)

模型:rbac基于角色的权限访问控制什么是权限?一个包含正则表达式的url就是权限第一个版本,实现简单的权限验证需求表结构:classUserInfo(models.Model):name=models.CharField(max_length=32)pwd=models.CharField(max_length=32)roles=models.ManyToManyField(... 查看详情

[linux之权限管理⽤户组管理](代码片段)

...有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。RBAC权限模型的扩展模型的完整设计图如何查看用户 查看详情

权限想要细化到按钮,怎么做?(代码片段)

...判断4.角色与权限4.1RBAC简介4.2RBAC的提出4.3RBAC三原则4.4RBAC模型分类4.4.1RBAC04.4.2RBAC14.4.3RBAC24.4.4RBAC34.5扩展5.表设计6.代码实现因为写了不少SpringSecurity文章的缘故,所以总是有小伙伴来问松哥:按钮级别的权限怎么实现?... 查看详情

权限想要细化到按钮,怎么做?(代码片段)

...判断4.角色与权限4.1RBAC简介4.2RBAC的提出4.3RBAC三原则4.4RBAC模型分类4.4.1RBAC04.4.2RBAC14.4.3RBAC24.4.4RBAC34.5扩展5.表设计6.代码实现因为写了不少SpringSecurity文章的缘故,所以总是有小伙伴来问松哥:按钮级别的权限怎么实现?... 查看详情

rbac从入门到精通

...#xff1a;rbac具体代码实现参考RBAC介绍,案例讲解基于RBAC模型的通用权限管理系统的设计(数据模型)的扩展扩展RBAC用户角色权限设计方案什么是RBAC权限系统与RBAC模型概述RBAC用户、角色、权限、组设计方案基础平台项目之树形菜... 查看详情

modulezero模块[x-admin&abp框架开发-rbac](代码片段)

...复杂。RBAC0:是RBAC的核心思想。RBAC1:是把RBAC的角色分层模型。RBAC2:增加了RBAC的约束模型。RBAC3:整合RBAC2+RBAC1。 二、ABP中的RBAC  在Abp中,已经集成了这些概念,并在ModuleZero模块中实现了这些概念,基于IdentityServer4的Mod... 查看详情

基于rbac权限控制模型的管理系统的设计与实现(代码片段)

文章目录一、RBAC权限设计1.1模型概述1.2模型分类二、基于RBAC的后台管理系统2.1项目概述2.2技术选型2.3内部处理流程2.4功能模块展示2.5权限控制展示2.6下载说明一、RBAC权限设计1.1模型概述  基于角色的访问控制RBAC,是实施... 查看详情

基于rbac权限控制模型的管理系统的设计与实现(代码片段)

文章目录一、RBAC权限设计1.1模型概述1.2模型分类二、基于RBAC的后台管理系统2.1项目概述2.2技术选型2.3内部处理流程2.4功能模块展示2.5权限控制展示2.6下载说明一、RBAC权限设计1.1模型概述  基于角色的访问控制RBAC,是实施... 查看详情

项目一众筹网03_5_rbac(权限管理)模型-概述

系列文章目录文章目录系列文章目录18-RBAC模型-概述19-RBAC模型-多对多在数据库的表示20-RBAC模型-RBAC0~321-RBAC模型-RBAC模型的数据库表示22-Ajax工作模式探讨-异步(下一篇)23-Ajax工作模式探讨-同步24-Ajax工作模型探讨-总结18-RBAC模型-概... 查看详情

权限系统设计详解(代码片段)

...解老权限系统的问题与现状业界权限系统的设计方式RBAC模型ABAC模型ABAC模型的原理新权限系统的设计思想权限系统自身的权限管理权限类型的定义默认角色的分类新权限系统的核心模块设计系统/菜单/数据权限管理菜单管理角色... 查看详情

实习小结---权限管理(rbac)(代码片段)

...色分析完成后,统计了一下页面,居然达到40多个。。。数据库中表一共只有六七个,存在多个页面之间数据重复显示得现象。这时候就需要加入权限管理,一个页面,每个人登录进来后只要显示得页面不同即可。  设计理念... 查看详情

springboot整合springsecurity实现权限控制:菜单管理(代码片段)

...ringSecurity实现权限控制(二):权限数据基本模型设计》《SpringBoot整合SpringSecurity实现权限控制(三):前端动态 查看详情

用户权限管理数据库设计(rbac)

...有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)  角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:... 查看详情

4crm-权限管理rbac(代码片段)

1、引入权限组件rbac1、settings配置app、中间件INSTALLED_APPS=[......‘crm.apps.CrmConfig‘,"stark.apps.StarkConfig",‘rbac.apps.RbacConfig‘,]中间件MIDDLEWARE=[。。。。‘rbac.service.rbac.ValidPermission‘,]2、员工表UserInfo和rbac.Us 查看详情

rbac用户权限管理数据库设计

...拥有若干权限。这样,就构造成"用户-角色-权限"的授权模型。 查看详情