数据权限简单设计思路

  • 现有权限控制分类
    • 数据权限控制
    • 服务架构流程
      • 权限字段的注册
      • 权限字段授权
      • 权限字段鉴权
    • 前端界面适配
      • 动态渲染数据字段
  • 开发注意事项及思考
    • 权限合并
      • 权限的叠加
      • 规则的叠加
    • SQL拦截的通用可能性

现有权限控制分类

软件开发绕不过的两道基础集成功能,认证、鉴权,前者基于登录信息识别、校验、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 {@Overridepublic Object intercept(Invocation invocation) throws Throwable {//逻辑代码区return invocation.proceed();}@Overridepublic Object plugin(Object target) {//生成代理对象return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}

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

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

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

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

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

@Overridepublic 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");//获取sqlBoundSql boundSql = handler.getBoundSql();String sql = boundSql.getSql();//增强sqlreturn 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

数据权限简单设计思路相关推荐

  1. mysql排行榜制作思路_排行榜的简单设计思路

    TOC 前言 排行榜几乎已经成为互联网应用中的必备模块,特别是游戏领域,它是对某一相关同类事物的客观实力的反映,带有相互之间的比较性质,带有竞争意义. 对于平台来说,可以带来一定的权威性,提高平台影响 ...

  2. SAP Basis DEBUG改表数据权限角色设计

    SAP Basis DEBUG改表数据权限角色设计 项目实践中,因种种原因不得不要通过debug才能解决一些特定的问题,所以就涉及到了debug权限角色的定义了. DEBUG的权限,无非就是: 1)数 ...

  3. ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛《住房月租金预测大数据赛》——设计思路以及核心代码—191017再次更新

    ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛<住房月租金预测大数据赛>--设计思路以及核心代码-191017再次更新 目录 竞赛相关信 ...

  4. 数据权限设计思路_后台权限管理设计思路:三种模型分析

    编辑导语:任何系统/产品搭建时,最先考虑的都应该是权限管理模块,而且权限管理模块的清晰.稳定是平台产品健康发展的基石,权限管理核心考虑的问题是用户与权限的关系.本文作者对三种不同权限管理的版本展开了梳 ...

  5. 经验总结|一个移动端数据产品的设计思路

    在企业内部或者入驻电商平台的商家.业务方,每天有大量的人在查看大量的指标,用于监控.分析业务的发展.同时,又有着能够随时随地,方便快捷的查看分析数据的诉求.本文想简单介绍下可以随时随地查看数据.分析数 ...

  6. 常见的大数据平台架构设计思路

    近年来,随着IT技术与大数据.机器学习.算法方向的不断发展,越来越多的企业都意识到了数据存在的价值,将数据作为自身宝贵的资产进行管理,利用大数据和机器学习能力去挖掘.识别.利用数据资产.如果缺乏有效的 ...

  7. 网络安全等级保护测评——岗位职责、权限划分设计思路(三权分立)

    一.设计思路 1.1三权指什么? 配置.授权.审计 1.2 三员及权限的理解 系统管理员:主要负责系统的资源和运行进行配置.控制和管理,包括用户身份.系统资源配置.系统加载和启动.系统运行的异常处理. ...

  8. 等保测评--- 岗位职责、权限划分设计思路(三权分立)

    一.设计思路 1.1三权指什么? 配置.授权.审计 1.2 三员及权限的理解 系统管理员:主要负责系统的资源和运行进行配置.控制和管理,包括用户身份.系统资源配置.系统加载和启动.系统运行的异常处理. ...

  9. 数据权限这样设计,领导直呼666!

    在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据. 控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC,但是控制用户只能访问某部分资源(即我们 ...

最新文章

  1. Magento入门基础 - 后台如何批量导入产品及产品图片
  2. 深度学习在gilt应用——用图像相似性搜索引擎来商品推荐和服务属性分类
  3. 腾讯上海某实验室SQL面试题——查询最后任职信息
  4. 12-CoreData操作大量数据时的注意细节
  5. swift中为什么要创造出可选型?
  6. xsl判断节点存在_HashMap1.8之节点删除分析
  7. 95-270-020-源码-指标监测-概述
  8. grafana+zabbix 部署分布式监控系统
  9. Java基础:红黑树概念
  10. MATLAB求解分段函数
  11. 联想 710s 安装win7(win 10 换 win 7)读不出硬盘,需要 NVME驱动
  12. 《逻辑:你认为正确,就一定正确吗?》
  13. 全国区号码表(绝对全)
  14. MOD04_3K 产品使用方の法学习
  15. 乘法原理的例题和答案_加法原理与乘法原理练习题
  16. Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
  17. 超实数探索浪潮波及中国数学界
  18. POJ 1737 Connected Graph (大数+递推)
  19. 向 Excel 和 PowerPoint 添加可编辑地图的指南
  20. 用户层调用nl80211的例子

热门文章

  1. python实现离线翻译_基于python实现百度翻译功能
  2. 技术大佬都在看的几个公众号
  3. ubuntu su 密码
  4. ROS2学习笔记22--使用launch启动/监听多个node节点
  5. 2021-4-19学习笔记
  6. Sentinel-2(哨兵2号)SNAP预处理
  7. 【动态规划】图像压缩问题
  8. 会写 Parser、Tokenizer 是什么水平?
  9. 教你识别思科交换机型号
  10. Linux下 Python通过ctypes调用cAPI (一)