1、数据权限概述

1.1、什么是数据权限?

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:787707172,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

数据权限是指对系统用户进行数据资源可见性的控制,通俗的解释就是:符合某条件的用户只能看到该条件下对应的数据资源。那么最简单的数据权限大概就是:用户只能看到自己的数据。而在正式的系统环境中,会有很多更为复杂的数据权限需求场景,如:

领导需要看到所有下属员工的客户数据,员工只能看自己的客户数据;

经理A能看到所有企业客户,经理B只能看到年销售额小于1000万的企业客户;

角色A能看到全国的产品数据,角色B只能看到上海的产品数据;

上述这些需求,使用硬编码也是可以实现的,但是在业务快速发展的过程中,类似这种数据权限需求会越来越多,如果全部采用硬编码的方式,无疑会给我们带来巨大的开发和维护压力。

1.2、要素分析

从当前登录用户的角度来说,数据权限的定义可以解释为:当前登录的用户只能看到该用户权限范围内的数据资源。由此可以分析出数据权限控制中几个关键要素:

主体,即当前登录用户。领导、角色等概念可翻译为当前登录用户是否是领导,是否拥有某角色。

数据资源。即受管控系统数据。

条件规则。即当前登录用户对于某特定的数据资源适用的条件。

2、数据权限设计

理论上来说,用户在访问受控的系统数据时,获取用户对该数据资源适用的条件规则,并将该条件规则解析为SQL查询语句即可实现对数据的权限控制。但是在实现过程中,还是会有很多难点,譬如当前登录用户适用下列规则:

客户数据:[客户经理] [包含于] [下属人员]产品数据:[销售地区] [等于] [上海]订单数据:([产品销售地区] [等于] [上海])[并且] ([客户市场经理] [包含于] [下属人员])

思考如下问题:

[客户经理] [包含于] [下属人员]如何解析为SQL语句?多表联合查询时又该如何处理?

[下属人员]由系统根据当前登录用户计算而来,上海由管理员后台选择。两种方式如何兼容?

对于复杂多变的组合条件,应该如何设计?

如何确定当前查询应该应用哪些条件规则?

一个用户拥有多个角色,不同角色对于同一个规则设置不同的值应该如何处理?

2.1、规则元

名词定义:规则元。在本文是指单个独立的数据规则定义,不同用户对规则元可设置具体的规则过滤值,该值用作数据查询时的筛选条件。上述规则中[客户经理],[销售地区]都属于规则元。

2.2、规则元配置

1.规则元名称的配置。一个表中哪些字段可以进行规则设置,以及规则元名称如何与表字段关联。(如上述规则中[客户经理],[销售地区]),比较容易想到的方法是通过配置文件维护规则名称与数据库字段之间的关系。

2.规则元Value数据源的配置。如上述规则中的[下属人员],[上海],不难发现规则元Value来源有三种情况:

后台管理人员输入。

系统提供数据源,后台管理人员选择。如:所在地区[上海]

系统提供数据。如:[下属人员]

配置文件可以实现数据规则的配置需求,但是当规则元越来越多时,维护配置文件就会变得麻烦起来,我们是否可以效仿spring-boot取代spring-mvc的做法,使用注解来代替配置呢?每一条数据规则最终都会落到对数据库字段的控制,而现在绝大部分系统都会有一个Model层对应到数据库中的表,于是脑补出一个绝佳的规则元配置方式:

@TableName("test")

public class TestModal extends AbstractModel {

@DataRule(name = "规则元名称")

private String name;

}

@DataRule注解源码如下:

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

public @interface DataRule {

/**

* 规则元名称

*/

String name() default "";

/**

* 规则元值来源类型

*/

RuleSourceStrategy strategy() default RuleSourceStrategy.TEXT;

/**

* 当数据来源是用户选择时{@code RuleSourceStrategy.CHOICE}数据地址

*/

String url() default "";

/**

* 当数据来源是系统提供时{@code RuleSourceStrategy.SYSTEM}提供器类名

*/

Class extends IDataRuleProvider> provider() default NullDataRuleProvider.class;

}

系统启动时,将规则元配置信息(名称、对应数据表、对应字段、值来源类型,值来源url,值来源提供者类名等)同步至数据库。数据表简单设计如下图:

2.3、数据规则的配置

有了规则元信息,管理人员即可在系统中针对不同用户(角色)设置规则元Value,该值作为数据查询时的筛选条件。规则元Value数据源包含三种情况,其中第①、②种情况下,需要管理员填写或选择该规则的值,存储于数据库;第③种情况下,Value值根据当前登录用户计算得出,也即是@DataRule注解中provider计算得来的值。由数据库存储的规则与系统计算得到的规则合并后即是登录用户的所有数据规则。

一个简单的配置界面如下:

2.4 数据规则的解析

由上文可知,适用于当前登录用户的数据规则主要来源有两种:

存储在数据库中的规则配置;如:所在地区[上海]

需要系统计算的规则配置;如:[下属人员]

两种情况下获取的数据规则合并之后即可获取适用于当前登录用户的数据规则集合,流程图如下:

两种情况下获取的数据规则如何兼容?规则合并后成为一个复杂的查询条件应该如何设计?

定义通用的规则结构如下:

{

rule:[{

field: "name",

operate: "equal",

value: "xxx"

}],

operate:"and",

group:[{

rule:[],

operate:"greater",

group:[]

}]

}

数据库存储规则结构的JSON串,合并时将JSON串反序列化之后使用and与系统计算得出规则对象连接即可,合并后的规则结构解析成简单SQL语句已经不是很难了。

但是对于多表联合查询时应该如何处理呢?

解析成SQL语句时可以使用表名+字段名的方式,可是遇到查询中使用别名的时候,这种方式也不能正常工作,这里暂时的处理方式是支持解析时传递别名。

一个用户拥有多个角色,不同角色对于同一个规则设置不同的值应该如何处理?

譬如,用户A拥有角色role1、role2,其中:

role1适用规则:[销售地区] [等于] [上海]role2适用规则:[销售地区] [等于] [北京]

那么用户A合并后的数据规则应该是:

用户A适用规则:([销售地区] [等于] [上海]) or ([销售地区] [等于] [北京])

即:一个用户对于同一个规则元的多个规则设置,应使用or连接后再与其他规则元进行and连接。

2.5、确定当前查询适用的数据规则

经过上述的规则配置与解析之后,我们很容易拿到当前用户适用的数据规则集合。但是在一次查询时我们应该使用集合中哪些规则进行过滤呢?一次查询是否开启数据规则过滤,使用哪些表的规则过滤应该是开发者来决定,类似:

xxxQuery(...).withDataRule("`table1`,`table2`");

即表示当前用户本次查询使用table1、table2中配置的数据规则。数据表中的每条规则应该支持在管理后台设置是否启用,这样理论上可实现每个用户对每一条数据规则的配置。

欢迎工作一到八年的Java工程师朋友们加入Java高级交流:787707172

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

java 数据权限_通用数据权限的思考与设计相关推荐

  1. 大数据开发和java的前景_大数据开发和javaEE后端开发哪个就业前景好?

    javaEE后端开发和大数据开发(Hadoop Spark...)哪个就业前景好? 本科计算机毕业一年了最近在自学想选择一个方向努力有JavaSE基础想知道这两个方向市场怎么样我知道javaEE后端开 ...

  2. java程序框图 质数_程序框图——数据大爆炸

    生活在被海量的数据包围的世界中,我们每天也在不断地创造数据. 我们过去几年创造的数据,超过了人类历史时期所创造数据的总和. 数据渗透在股票市场的风起云涌中,渗透在一餐一食的选择里,渗透在远方星系的微弱 ...

  3. 数据创造价值_展示数据并创造价值

    数据创造价值 To create the maximum value, urgency, and leverage in a data partnership, you must present th ...

  4. 大数据工作流_大数据和人工智能时代下的数字化工作流

    点击上方"Bentley软件"可以订阅哦 本文作者 Bentley 软件公司 高级技术经理 赵顺耐 大数据.人工智能以及与之相伴相生的物联网已经成为现代社会的运行方式,信息技术的急 ...

  5. 数据安全审计_使用数据级安全性对InfoSphere Guardium中的审计结果进行细粒度访问控制

    数据安全审计 数据级安全性对职责分离的重要性 处理数据的组织需要关注遵守不同程度的职责分离强制执行情况. 这意味着要确保没有多人参与和审查就无法完成任务,因为欺诈和人为错误的可能性较小. 这就是为什么 ...

  6. 什么是大数据口子_大数据分析师年薪几十万,学什么专业才能从事大数据?

    近几年,大数据为各个领域带来了全新的变革,大数据的重要性越来越被企业和国家所看到,大数据工作者的需求再次被无限放大,他们的薪资和社会地位也在不断上涨.马云在演讲中就提到,未来的时代将不是IT时代,而是 ...

  7. 如何成为数据科学家_成为数据科学家需要了解什么

    如何成为数据科学家 Data science is one of the new, emerging fields that has the power to extract useful trend ...

  8. 大数据数据收集数据困难_大数据架构、大数据开发与数据分析的区别

    是新朋友吗?记得先点蓝字关注我哦- 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析  人工智能+Python | 人工智能+物联网 来源:小职(z_zhizuobiao ...

  9. oracle 数据立方_大数据之数据仓库分层

    大数据之数据仓库分层 1. 什么是数据分层? 2. 数据分层的好处 一种通用的数据分层设计 3. 举例 4. 各层会用到的计算引擎和存储系统 5. 分层实现 6.数据分层的一些概念说明 7.大数据相关 ...

最新文章

  1. linux gdb 运行的程序,GDB(十)--调试正在运行的进程
  2. 【数字信号处理】周期序列 ( 正弦序列特性 | 单个模拟周期采集 m 个数字样本 | Q 个模拟周期采集 P 个数字样本 | 非周期序列的情况 | 数字信号周期 )
  3. python字典成绩_python_字典
  4. 如何用Pygame写游戏(九)
  5. [Objective-C语言教程]数组(14)
  6. openoffice将html转成pdf,通过openOffice将office文件转成pdf
  7. android循环滚动textview,Android 循环上下滚动
  8. L1-042 日期格式化
  9. vb.net 教程 11-1 打印组件 5 PrintPreviewDialog
  10. MySQL手册chm格式文档
  11. 安卓装Linux ,坑真的多,Linux deployTermux踩坑记||在旧手机上建立自己的服务器(1)||2020年新货
  12. Axure中SVG矢量图标的使用方法及资源推荐
  13. 关于程序员的教育和培训
  14. 华为云HMS Core 助力鸿蒙开发
  15. 无边的爱浸湿了我的心
  16. 【微信】绕过限制,在PC上调试微信投票页、砍价页
  17. python中breakpoint_Python3.7 特色(2)-breakpoint 內建除錯
  18. 从线下走到线上,艺术品能否找到新突破口?
  19. Hdfs的一系列坑坑洼洼,认证,认证,还是***认证
  20. alter diskgroup <磁盘组名> check all norepair;

热门文章

  1. C++实现计算技能伤害,一套秒杀!LOL无限视距(C++源码)
  2. VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中
  3. 元宵节,我们用Scratch来做一个猜灯谜的游戏吧!(文末有福利)
  4. Dridex样本分析
  5. Node.js TLSSocket 库里涉及到的证书链的概念简介
  6. uniapp 购物车 单店铺
  7. QTA自动化测试框架(一)
  8. Python基础_06:字典和集合
  9. 浙江高校计算机大学外语,关于做好2020年下半年浙江省大学外语等级(CET3)考试报名工作的通知...
  10. 北医三院一位医生的文章