数据权限简单设计思路

数据权限方案设计(后端) 数据权限设计方案 阅读详情

现有权限控制分类

软件开发绕不过的两道基础集成功能,认证、鉴权,前者基于登录信息识别、校验、OAuth协议的授权认证、CAS、JWT等Token单点;后者采用基于Spring-Security、RBAC模型访问控制,表现为菜单、功能api访问的权限资源关联角色载体,角色关联用户的权限控制。

数据权限控制

数据权限属于权限一种,基于sql层面的字段可见、数据范围可见,常用场景,不同管理岗位同一张表不同字段可见性不同,华中区负责人看到当前区城市数据,单一城市只能看到当前市负责数据等
思考:能否通过接口返回值过滤?(分页、sql查询效率、后处理返回效率)

服务架构流程

权限字段的注册

数据权限资源的注册,需要鉴权的服务端启动的时候将自身链接数据库的所有表,所有字段的元数据信息注册到服务端,f_datacolumn用来存储字段权限信息,唯一键标识为:项目+库+表+字段名,字段类型,字段注释等辅助信息便于赋权规则时操作,时间类型赋值时间组件筛选范围,数值、字符串、字典值均可转换可视化赋值;f_rulecolumn存储权限字段赋予的规则信息;【界面可视化操作,针对指定字段+字段逻辑操作符(and、or)+字段运算符(in范围、<>=!=值、contain包含)+字段匹配值(时间组件、数值、文本、字典值、内置变量{当前用户的机构、岗位等})】f_columnrole关联字段和角色,以至角色关联用户。
在这里插入图片描述

权限字段授权

在这里插入图片描述

权限字段鉴权

在这里插入图片描述

mybatis提供的intercept插件拦截

@Intercepts({ @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.class }) })
public class FetchSqlInterceptor implements Interceptor {
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		//逻辑代码区
		return invocation.proceed();
	}
	@Override
	public Object plugin(Object target) {
		//生成代理对象
		return Plugin.wrap(target, this);
	}
	@Override
	public void setProperties(Properties properties) {
	}
}

实现 Interceptor 接口也就是实现intercept,plugin,setProperties这三个方法,其中

①intercept方法是我们拦截到对象后所进行操作的位置,也就是我们之后编写逻辑代码的位置。

②plugin方法,根据参数可以看出,该方法的作用是拦截我们需要拦截到的对象。

③setProperties方法,我们可以通过配置文件中进行properties配置,然后在该方法中读取到配置。

这三个方法的执行顺序: setProperties—>plugin—>intercept

@Override
	public Object intercept(Invocation invocation) throws Throwable {
		StatementHandler handler = (StatementHandler)invocation.getTarget();
		//由于mappedStatement中有我们需要的方法id,但却是protected的,所以要通过反射获取
		MetaObject statementHandler = SystemMetaObject.forObject(handler);
		MappedStatement mappedStatement = (MappedStatement) statementHandler.getValue("delegate.mappedStatement");
		//获取sql
		BoundSql boundSql = handler.getBoundSql();
		String sql = boundSql.getSql();
		//增强sql
		return invocation.proceed();
	}

实现插件接口后,添加至mybatis @Configuration、@Bean配置中

sqlSessionFactory.getConfiguration().addInterceptor(new FetchSqlInterceptor());        

原始sql:

SELECT id,name,email,age FROM t_userinfo;
  • 待鉴权客户端页面请求数据接口
  • 持久层拦截使用JSqlParser工具解析原始sql获取表名
<dependency>
   <groupId>com.github.jsqlparser</groupId>
   <artifactId>jsqlparser</artifactId>
   <version>4.0</version>
</dependency>
  • 拦截调用服务端接口获取该用户拥有当前系统的字段规则(服务端根据用户code获取角色、角色关联的表字段、表字段关联的字段,根据字段规则:逻辑符+字段名+运算符+条件值,example:and age < 35),解析出字段规则表达式
  • JSqlParser工具解析原始sql对应表的where条件+and 1=1 + 字段规则表达式
  • 执行增强sql,返回数据

加强后的sql:

SELECT id,name,email,age FROM t_userinfo WHERE 1=1 and age < 35;

前端界面适配

动态渲染数据字段

根据数据鉴权返回的结果,数据范围上的限制,无需更改,字段限制上,动态适配渲染表单列即可。

开发注意事项及思考

权限合并

权限的叠加

用户和角色的关联关系是一对多的,任何如岗位上的不同权限,多部门分管的特殊情况,都可以使用多个角色分配、权限叠加使用,如此便涉及到多个角色的权限叠加结果问题,若是不同字段取多个角色关联的多个字段直接并集即可,不同角色包含同一个字段冲突导致的不同配置规则是需要逻辑层面的处理取得更大范围的逻辑上的权限为最终结果。

规则的叠加

  1. 针对多个角色叠加,导致的一个字段有多个规则是需要业务考虑的,简单的运算符上的age > 10 和 age > 25,最终取得规则一定是数据范围更大的 age > 10,<、=、!=逻辑一致;
  2. 字典值和内置变量,有逻辑上的范围大小,如当前所在的部门、上级部门、当前所处的岗位、上级领导岗位,则需梳理出字典值和内置变量中的排序字段,数值越小岗位或部门越大,根据此排序字段来合并规则条件,范围大者替代原则
  3. 若有字段配置冲突既等于又不等于,或大于大的数值小于小的数值,在角色分配叠加时候校验给出提醒是否是正确的权限需求分配方式,或冲突字段直接采用or逻辑符连接均保留(and (age > 25 or age < 10))

SQL拦截的通用可能性

  1. 基于Spring容器托管的持久层框架均可通过代理模式,截取执行的sql,例如本文的mybatis提供的插件实现(JPA中Hibernate也提供了类似StatementInspector接口类)
  2. 不同类型数据库驱动如mysql提供了一个接口实现类com.mysql.jdbc.StatementInterceptor(StatementInterceptorV2)配置链接url添加参数jdbc.url=jdbc:mysql://127.0.0.1:3306/test?statementInterceptors=xxxStatementInterceptor,除此之外原生jdbc等不同封装的持久层框架可能不容易获取到sql
数据权限就该这么设计 在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据。控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC,但是控制用户只能访问某部分资源(即我们常说的数据权限)使用RBAC模型是不够的,本文我们尝试在RBAC模型的基础上融入数据权限的管理控制。首先让我们先看下RBAC模型。 阅读详情

相关推荐

数据权限设计初探

数据权限设计初探   李俊杰概述在许多项目中,都会涉及到数据权限问题,所谓数据权限是表示,在系统中即使角色相同,都有操作权限,但业务操作时受风险、额度、销售区域等业务属性限制。如销售人员可以看到自己的销售列表,而销售经理可以看到其管辖范围内的销售人员的销售列表,而高级销售经理能看到其下辖的销售经理的销售列表,更进一步,只看金额超过1000万的单子,小于1000万的单子不看。如销售人

4631

权限管理之数据权限(若依框架)

数据权限设计 AOP + 自定义注解 实现数据权限

weixin_41842550的博客 2万+

数据权限设计思路_四个步骤手把手教你设计通用数据权限

1、数据权限概述1.1 什么是数据权限?  数据权限是指对系统用户进行数据资源可见性的控制,通俗的解释就是:`只有符合条件的用户才能看到该条件下对应的数据资源`.举个简单的例子:  本组织的销售人员只能看见本组织的客户信息。  某专职会计只能看见A部门及其下级部门的单据。  上述这些需求,使用硬编码也是可以实现的,但是在业务快速发展的过程中,类似这种数据权限需求会越来越多,如果全部采用硬编码的方式...

weixin_39983404的博客 4505

数据权限的设计与实现系列1——数据权限的设计与思考

权限控制是一个系统的核心功能,可以分为两类,一类是功能权限,一类是数据权限。数据权限又可以进一步分为行级权限和列级权限。功能权限,是指系统用户能进行哪些操作,通常是菜单和按钮权限,如打开订单菜单,查询订单列表,创建新订单。对于功能权限,有标准化的解决方案,也即RBAC,通过权限项、角色、用户三张主表,以及角色-权限项对应关系表和角色-用户对应关系表两张辅助表,一共5张库表即可实现功能权限的功能,系统管理员通过系统界面即可实现灵活的权限分配和维护。

学海无涯,行者无疆 7300

数据权限设计

随着IT新技术不断完善成熟,企业数字化建设得到全面的发展,数据将成为一个创造财富的重要来源,并且越来越多地被视为一项值得重视的企业资产。未来,很多企业之间的竞争,其实也是资源和数据竞争。那么针对数据资产,如何保障它的安全性呢?数据的权限管理无疑是必不可少的。数据权限从数据源来控制不同的用户能够查看、使用和授权不同的数据表数据(其实就是数据表行列的管控),就如同筑起了一道道护城墙,为数据安全提供了保障。

qq_40664711的博客 1万+

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 638

通用权限管理设计 之 数据权限

前言   前一篇文章《通用权限管理设计 之 数据库设计方案》介绍了【主体】- 【领域】 - 【权限】( who、what、how问题原型 ) 的设计思想   本文将对这种设计思想作进一步的扩展,介绍数据权限的设计方案。 权限控制可以理解,分为这几种 : 【功能权限】:能做什么的问题,如增加产品。 【数据权限】:能看到哪些数据的问题,如查看本人的所有订单。 【字段权限】:能看到哪

wota5037的博客 2万+

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9241

简单的权限设计

原来做OA的时候一直不知道权限怎么写。   受到原来粗粒度权限控制的观念影响,所以将问题复杂化了让我不知道怎么下笔。   原先的粗粒度控制权限: 书写一个过滤器,过滤器的映射范围即权限控制的范围。 游客只能访问公共的部分jsp或者controller。 我的例子的权限分为3个地方: 游客、用户、管理员。 所以写一个或者两个过滤器。在访问指定内容前进行session或者application中的身...

weixin_33726313的博客 203

保姆级教程:用STM8S207R6和FD6288T自制BLDC驱动板,从原理图到代码框架搭建

本文提供了一份详细的STM8S207R6和FD6288T自制BLDC驱动板教程,涵盖从原理图设计到代码框架搭建的全过程。通过硬件选型、电源电路设计、PWM定时器配置等关键步骤解析,帮助开发者快速掌握无刷直流电机驱动技术,实现高效稳定的电机控制方案。

weixin_28729205的博客 489

ESP32—C3实现网页跳转

用户点击HTML页面中的按钮。浏览器根据按钮的href属性向服务器发送HTTP GET请求。服务器根据请求的URL调用相应的回调函数。服务器发送包含新页面HTML内容的HTTP响应。浏览器解析并显示新的HTML页面。这个过程对于用户来说是无缝的,看起来就像是直接从一个页面跳转到另一个页面。实际上,背后发生了HTTP请求和响应的过程。

qq_59527512的博客 1024

数据权限设计思路_权限设计数据权限

任何一个系统中,都离不开权限的设计 权限设计 = 功能权限 + 数据权限+字段权限 【功能权限】:能做什么的问题。如查询、增删改信息【数据权限】:能看到哪些数据的问题。如查看本人、部门团队、区域或者整个公司、甚至整个系统的数据【字段权限】:能看到哪些信息的问题。如联系人姓名,但是不能查看到联系人地址、联系人电话这样的 1.功能权限设计 常常是基于RBAC(Role-Based Access Control)的一套设计方案 2.数据权限设计 2.1数据权限设计分析 ...

Turn X7 1万+

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

通用数据权限的设计思路

接着上个襄阳项目的需要, 目前的项目情况是,一期已经把功能权限做完了,可以对不同用户的不同权限功能做到限制,现在需要做数据的权限,不同的用户看到不同的数据。 根据目前的调研情况,有两种数据级别权限设计思路,都可以实现对人员访问的数据权限控制,从而实现不同的人员能够看到不同的数据,例如经理能够看到其部门下所有人的数据,而单个的员工只能看到自己的数据。用户拥有的权限越大,能看到的数据就越多。 第一...

长河的博客 1万+

K-Core, K-Shell & K-Crust傻傻分不清楚

K-Core(K-核)就是所有大于等于K的K-Shell的并集;K-Crust(K-皮)就是所有小于等于K的K-shell的并集。

欢迎订阅 -- 小源笔迹 2256

QT西游回合制源码+java后台管理系统

这是一套回合制游戏源码,很适合学习。

renkai721的专栏 2536

灵活的数据权限思路

我一年java,在小公司,当前公司权限这块都没有成熟的方案,目前我知道权限分为功能权限和数据权限,我不知道数据权限这块大家是怎么解决的,但在实际项目中我遇到数据权限真的复杂,你永远不知道业主在这方面的需求是什么。

BUG指挥课堂 3320

【读代码】从claude skills到superpowers项目

最近claude skills成了大热门,今天一起看下GitHub 上的开源技能框架,他将“工作流”封装为“技能” (Skills)。本文尝试剖析该项目的技能粒度定义、多技能关联架构、应用逻辑等。与传统的 Function Calling 不同,Superpowers 中的 Skill 定义粒度并非“原子操作”,而是**“认知模式” (Cognitive Mode) 或“工作阶段”**。

kakaZhui的博客 1922

数据权限设计研究-行数据权限

数据权限设计研究-行数据权限关于权限设计功能权限数据权限前提数据分类几种场景设计方案与思路映射表提供过滤sql的方法测试实际应用查询新增修改删除修改数据的私有,公开,部门属性私有改为部门私有改为公开部门改为公开其他变更总结 关于权限设计 一般来说,权限模块对于每一个系统而言都是最基础的模块,根据项目需求和功能的不同,设计方案也有许多。但从大的方面来说,可以将权限分为两大类型:功能权限和数据权限 功...

qq_38846242的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据权限设计思路_通用数据权限的思考与设计

作者:_liuxxhttp://cnblogs.com/liuyh/p/9774998.html1、数据权限概述1.1、什么是数据权限?数据权限是指对系统用户进行数据资源可见性的控制,通俗的解释就是:符合某条件的用户只能看到该条件下对应的数据资源。那么最简单的数据权限大概就是:用户只能看到自己的数据。而在正式的系统环境中,会有很多更为复杂的数据权限需求场景,如:领导需要看到所有下属员工的客户数据,...

weixin_39556474的博客 1545

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路

数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路 正文 前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”、“我们希望不同的用户能看到不同时间段的扫描报表数据”、“我们系统需要不同用户查看不同的生产报表列”。诸如此类,最近经常收到项目上面的客户提出的这种问题,即所谓的“数据权限”,经过开会讨论决定:在目前的开发框架上...

王鹤霖的专栏 三人行必有我师 1041

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java数据权限设计思路_最好的权限设计,是先区分功能权限和数据权限

本文为我们介绍了功能权限和数据权限的不同点、以及不同部分中的要点与注意事项。做2B的系统总是不可回避的遇上权限问题,他不是核心业务却又必不可少,而且总是牵一发而动全身,更要命的是不同客户组织架构完全不同,功能复用性很低。有没有什么方法论能快速理清权限问题呢?我们一般说【权限】的时候是在说功能权限和数据权限。功能权限指用户登录系统后能看到什么模块,能看到哪些页面,而数据权限指的是用户在某个模块里能看...

weixin_42139252的博客 4453

数据权限设计思路_数据权限设计研究行数据权限

关于权限设计一般来说,权限模块对于每一个系统而言都是最基础的模块,根据项目需求和功能的不同,设计方案也有许多。但从大的方面来说,可以将权限分为两大类型:功能权限和数据权限功能权限主要控制不同的资源主体(用户、角色、组织等)有操作不同的资源的权限。比如常见的不同的角色能访问不同的页面(菜单权限),以及具有操作同一页面的不同功能(按钮权限)等等。对于java开发而言,功能权限的开发相对来说要...

weixin_39854730的博客 1360

数据权限设计思路_产品权限设计——首先区分功能权限和数据权限

产品权限设计——首先区分功能权限和数据权限权限管理系统是2B类产品必不可少的产品功能,牵涉整个产品的使用。权限管理功能不同的客户组织架构是完全不同的,功能的复用性很低,如何设计出高质量的权限管理功能是验证B端产品易用性的重要指标。我们一般说权限的时候是在说功能权限和数据权限。功能权限指用户登陆系统后能看到什么模块,能看到哪些页面,而数据权限指的是用户在某个模块里能看到几条数据,能看到哪些数据。功能...

weixin_39530647的博客 2396
上一篇: java代码构建简单http服务器和客户端
varCode
博客等级 码龄9年 11粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值