在橙单中,我们是通过mybatis拦截器统一拦截的,这样最大的好处是业务代码的解耦,不用每个开发人员,都自己写过滤了,很容易错和漏掉。

而mybatis拦截器,也是比较通用的插件方式

通过上图可以看到,我们支持部门过滤和用户过滤,这些都是可以在在线表单和生成器的路由表单中指定的,每个业务表都可以指定自己的

上图是生成器中的配置,在线表单也类似吧

重点说一下代码

生成的代码中,会多出注解,分别是部门和用户过滤

会生成响应的数据权限过滤注解

有需求是,这个mapper下,有的方法需要过滤,有的不需要
注解参数,可以指定哪些方法,不进行过滤
这个是纵向的

还有一种场景是,同一个方法,有的controller接口进来的时候,需要不需要过滤。
这种场景,在工作流中,比较常见,毕竟工作流的数据权限,需要和普通表单的相比,有些差距,需要更好的整合

比如截图中,查看草稿数据,这个就不需要数据过滤,这样我们可以在controller的入口加这个注解即可。

这个就是横向的细粒度控制

还有一种更复杂的控制,就是同一个controller中,有的需要,有的不需要。

当然,这里有个前提,就是业务主表一定是配置了数据过滤注解,否则那就不需要这些的,

现在介绍的前提都是业务主表配置了数据权限过滤。

在线表单和路由表单,行为都是一致的

在最复杂的场景下,也可以手动修改这个标记,对后续的sql,暂时停用数据过滤。

刚刚介绍的这些,都是如何使用

其实绝大多数场景,都不需要这么细粒度控制的

可以看到,我们所有的细粒度控制,都不会需要修改mybatis拦截器中的代码,通过外部的设置,即可完成横纵向的细粒度控制。

在简单介绍一下过滤实现,

数据权限过滤,效率极为重要,灵活性也很重要,因为数据过滤,几乎覆盖绝大多数的sql,select,delete和update,而不仅仅是select,所以他的优化尤为重要

先说简单的优化。明天再分享复杂的优化,涉及到的数据结构。

第一步,就是在服务启动的时候,将所有的实体类和mapper类的注解都预先解析好,并放到map中,便于快速检索

拦截器的入口代码,可以看到,我们这里都没有使用插件模式,多租户和数据过滤都在不同的方法里面,这样做主要还是为了效率,同时也便于二次开发的修改。

大家排错的时候,或者发现数据过滤不起作用的时候,这些几个return尤为重要。有的是逻辑,有的是优化

比如最后一个红框中最后一个return,就是当数据权限中,包含,“可以查看全部”的时候,就没必要继续过滤了,基于短路优化的原则。因为我们取的是数据并集。

用户的数据权限数据,在用户登录的时候,已经缓存到redis了。也是为了加速

这里插一句和效率无关的话,sql语句的动态解析,我们使用了jsqlparser,主要还是为了保证拦截后,sql语句注入的正确性,而且一味的追求效率,仅仅简单的在尾部添加where sql,那样对于子查询,就不work了,而橙单现有的方式,可以支持子查询,支持别名等更为复杂且通用的场景

这里才是真正处理数据权限sql的实现方法。

基于用户的过滤,没啥好优化的,主要的优化在部门过滤,

这里有部门过滤的合并

代码大家看一下,介绍一下合并机制,这样更加易于理解

比如用户A,有两个数据权限,分别是只看本部门和看本部门及其子部门
那个这个时候,只看本部门的数据权限,就没有必要继续使用了,因为后者覆盖了前者,这样我们生成的过滤sql,将只有适合后者,查看本部门及其子部门的。
如果不做合并优化,就会出现两个 deptId = 1 or dpet_id in (本部门和子部门id列表)优化后可以去掉deptId = 1那个
再说另外一种,本部门及子部门,和,多部门及子部门,如果选择的多部门中,包含本部门的话,那么前者就可以忽略了,
如果指定的多部门及其子部门中,不包含本部门,比如我的本部门id是1, 我选择的自定义部门是2,3,4这个时候,就不能忽略1,也就是本部门,但是我们同样做了优化,会把(1,2,3,4)合并到一起,做一次性的sql in list查询,而非一个 = 1 or in (2,3,4)
这两个优化都是非常典型的,其实还有其他的,橙单会推演,如果覆盖就和合并。
大家会问,动态合并也有微小的性能开销呀,虽然比不优化要好。
橙单当然也想到了,这些合并,不是动态查询时候合并,而是用户登录的时候,就完成了合并。

好了,今天就分享到这里了,后面会给大家分享,我们如何让递归的树形部门搜索,编程一次性的数据查询,没有递归。

树形部门扁平化,是一个通用的树形数据优化策略,有兴趣可以去看一下橙单的代码,我们极好的实现了这个,包含使用了闭包插入,等非常高效使用的代码技巧。

以后会给大家分享橙单的多数据源处理,也是极为灵活且直观的

橙单微服务的权限部分之过滤规则相关推荐

  1. 橙单微服务的权限部分

    假期前几天,给大家简单分享了橙单框架中的操作日志的体系,包括如何把从前端,到elk,再到skywalking等,如何完整的串联,如何使用定位线上问题,同时还介绍了JWT token部分,我们是如何实现 ...

  2. 橙单微服务之批量导入

    上面这些代码全部是自动生成的,批量导入 如果你配置了这个表单,支持批量导入,那么代码就会生成,否则不会. 出于性能考虑,这里可以存储在本地,当然也可以存储在minio等oss中 橙单会生成一部分需要忽 ...

  3. 微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题

    ~~微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题~~ RocketMQ-延时消息 实现延时消息 RocketMQ-消息过滤 Tag标签过滤 SQL标签过滤 管控台搜索问题 Rocket ...

  4. 微服务下权限校验方案

    微服务权限校验方案 权限概述 鉴权和权限控制 权限问题描述 权限概述 任何一个系统都绕不开权限这两个字,一个良好的权限设计对一个系统起到了非常重要的作用,其实权限设计是个范围很大的问题,包括从数据库的 ...

  5. 微服务网关Zuul路由ZuulFilter过滤

    一.需求 该过滤的条件是,只有请求参数携带有user的请求才可访问端口号为/abc8080工程,否则返回401,未授权.只有当访问/abc8080且user为空时是通不过过滤的,其它请求都可以. 二. ...

  6. 微服务网关Gateway实现Host过滤

    Host 路由 比如用户请求cloud.leon.com的时候,可以将请求路由给http://localhost:18081服务处理,如下配置: routes:- id: leon_goods_rou ...

  7. SpringCloud微服务权限控制(一)概述

    从单体应用到SOA应用再到Spring Cloud微服务构架,应用的安全访问都是非常重要的问题,怎么样设计微服务的权限控制?首先,权限控制可以分为三个部分:用户认证,服务权限,用户权限. 用户认证 用 ...

  8. 阿里巴巴前架构师360度无死角剖析微服务

    微服务是当前软件架构领域非常热门的词汇,在社区中也有很多热烈的讨论.因此,OSC第130期高手问答的主题是"究竟什么才是微服务",并邀请了黄勇作为高手嘉宾. 黄勇,现任特赞公司CT ...

  9. DDD微服务架构设计第四课 微服务落地实践的技术中台

    10 微服务落地的技术实践 如今,做一个优秀的程序员越来越难.激烈的市场竞争.互联网快速的迭代.软件系统规模化发展,无疑都大大增加了软件设计的难度.因此,对于架构师的能力要求也越来越高,就像我的一本书 ...

最新文章

  1. 收藏 | Tensorflow实现的深度NLP模型集锦(附资源)
  2. 通过Zookeeper动态感知服务器上下线[案例]
  3. stm32控制舵机任意角度_如何对舵机建模仿真?
  4. ubuntu 开发板ping通虚拟机挂载nfs服务器
  5. oracle报错00838,oracle11g的内存分配不当,导致的错误ORA-01034,ORA-00838,ORA-27101
  6. 两年AI研究经验(教训)总结,进来看看吧! 1
  7. 内存分配知识:全局,局部,静态变量
  8. .Net Core新建解决方案,添加项目引用,使用VSCode调试
  9. 渗透测试工程师面试题
  10. 股权比例的3种黄金分割线
  11. 微博是一种倒退,而非革命
  12. Selina现身代言发福 手臂上伤疤明显
  13. 蓝桥杯 算法提高 盾神与条状项链
  14. socks5代理IP的几种测试工具
  15. adprw指令教程_三菱FX3U从入门到精通(全套)
  16. Apache整合Tomcat详解系列(三)Apache性能调优
  17. 2022杭电多校赛第八场
  18. python安装和版本选择
  19. linux arm内核栈切换,linux-kernel
  20. GeoServer + openlayers

热门文章

  1. 中文文本分类——商品评论情感判别
  2. 【第九章】vim程序编辑器
  3. 数据结构课程设计-推箱子
  4. java反射例子_java反射简单例子
  5. 爬虫爬取二次元网站美女图片
  6. js数组要用的方法:push、pop、unshift、shift、splice、reverse、sort、concat、join、slice、indexof、foreash、map、filter
  7. java计算机毕业设计淮安城市开放大学实习实训管理系统源码+mysql数据库+系统+lw文档+部署
  8. linux查看image类型,ImageMagick 的一些高级图片查看技巧
  9. CM安装成功,CM的web界面登录不上解决方案
  10. 16 岁少年前往腾讯总部要求解封 QQ 账号;微软发内部信辟谣:没有关闭微软苏州的相关计划;Go 1.20 发布|极客头条