1通过DataScopePermissionHandler  改写

@Aspect
@Slf4j
@Component
public class DataScopePermissionHandler implements DataPermissionHandler {/*** 通过ThreadLocal记录权限相关的属性值*/ThreadLocal<DataScopeParam> threadLocal = new ThreadLocal<>();/*** 清空当前线程上次保存的权限信息*/@After("dataScopePointCut()")public void clearThreadLocal(){threadLocal.remove();log.debug("threadLocal.remove()");}/*** 注解对象*/private DataScope controllerDataScope;/*** 配置织入点*/@Pointcut("@annotation(com.xxx.base.datascope.annotation.DataScope)")public void dataScopePointCut() {}@Before("dataScopePointCut()")public void doBefore(JoinPoint point) {// 获得注解controllerDataScope = getAnnotationLog(point);if (controllerDataScope != null) {// 获取当前的用户及相关属性,需提前获取和保存数据权限对应的部门ID集合User currentUser = SecurityUtil.getUser();DataScopeParam dataScopeParam = new DataScopeParam(controllerDataScope.deptAlias(),controllerDataScope.deptField(),currentUser.isAdmin(),currentUser.getDataScope());threadLocal.set(dataScopeParam);log.debug("currentUser.getDataScope() = {}", currentUser.getDataScope());}}/*** 是否存在注解,如果存在就获取*/private DataScope getAnnotationLog(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {return method.getAnnotation(DataScope.class);}return null;}/*** @param where             原SQL Where 条件表达式* @param mappedStatementId Mapper接口方法ID* @return*/@SneakyThrows@Overridepublic Expression getSqlSegment(Expression where, String mappedStatementId) {log.debug("DataScopePermissionHandler .getSqlSegment");DataScopeParam dataScopeParam = threadLocal.get();if(controllerDataScope == null || dataScopeParam == null || dataScopeParam.isAdmin()){return where;}if (where == null) {where = new HexValue(" 1 = 1 ");}String deptSql = "".equals(dataScopeParam.deptAlias) ? dataScopeParam.deptField : dataScopeParam.deptAlias + "." + dataScopeParam.deptField;// 把集合转变为JSQLParser需要的元素列表ItemsList itemsList;if(CollectionUtils.isEmpty(dataScopeParam.secretary)){//如果权限为空,则只能看自己部门的itemsList = new ExpressionList(Collections.singletonList(new LongValue(SecurityUtil.getUser().getOrganizeId())));}else {//查看权限内的数据itemsList = new ExpressionList(dataScopeParam.secretary.stream().map(LongValue::new).collect(Collectors.toList()));}InExpression inExpression = new InExpression(new Column(deptSql), itemsList);log.debug("where = {}", where);log.debug("inExpression = {}", inExpression);return new AndExpression(where, inExpression);}/*** ThreadLocal存储对象*/@Data@AllArgsConstructorstatic class DataScopeParam{/*** 部门表的别名*/private String deptAlias;/*** 部门字段名*/private String deptField;/*** 是否是管理员*/private boolean isAdmin;/*** 数据权限范围*/private Set<Integer> secretary;}
}

2

mybatisplus sql 改写2相关推荐

  1. 优化案例 | CASE WHEN进行SQL改写优化

    导读 今天给大家分享一个通过SQL改写而独辟蹊径的SQL优化案例 待优化场景 发现SLOW QUERY LOG中有下面这样一条记录: ... # Query_time: 59.503827 Lock_ ...

  2. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

  3. Sharding-JDBC 源码之 SQL 改写

    Sharding-JDBC 系列 第一篇 Sharding-JDBC 源码之启动流程分析 第二篇 Sharding-JDBC 源码之 SQL 解析 第三篇 Sharding-JDBC 源码之 SQL ...

  4. mybatis sql 改写

    1mybatis sql 改写 package com.macro.mall.tiny.config;import lombok.extern.slf4j.Slf4j; import org.apac ...

  5. sharding-jdbc之SQL改写

    [引用官网]在包含分表的场景中,需要将分表配置中的逻辑表名称改写为路由之后所获取的真实表名称.仅分库则不需要表名称的改写.除此之外,还包括补列和分页信息修正等内容,如图: 本文主要以SELECT i. ...

  6. SQL做的能改成Oracle吗,从SQL改写到SQL重写,什么样的SQL才是好SQL?(黄浩)

    从SQL改写到SQL重写,什么样的SQL才是好SQL?黄浩 2016-12-14 10:02:26 作者介绍 黄浩,现任职于中国惠普,从业十年,始终专注于SQL.十年一剑,十年磨砺.3年通信行业,写就 ...

  7. SQL改写的书终于出版了

    众所周知,SQL 优化很多 SQL 都是写法上有问题,目前市面上没有这种书籍,为了造福广大Oracle使用者 教主和我特意编写 SQL 改写 优化的书籍 ,大家可以到这里购买 https://item ...

  8. Mybatis-plus sql注入以及防止sql注入

    Mybatis-plus sql注入 以及防止sql注入 一.SQL注入是什么? SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的SQL语句中来改变查询结果,例如: ...

  9. Sharding-JDBC 源码分析 —— SQL 改写

    1. 概述 前置阅读:<SQL 解析(三)之查询SQL> 本文分享SQL 改写的源码实现.主要涉及两方面: SQL 改写:改写 SQL,解决分库分表后,查询结果需要聚合,需要对 SQL 进 ...

最新文章

  1. PWA(Progressive Web App)入门系列:消息通讯
  2. 实现EventHandler的监测
  3. 如何在Xbox One或PlayStation 4上为Skyrim特别版安装Mods
  4. HDU2059(DP)
  5. magento转移搬家
  6. 设计模式三(工厂方法模式)学习笔记
  7. c4d如何把文字贴在物体表面_一篇文章带你了解C4D布光技巧
  8. php点击下拉框触发数据汇总,easyUI下拉列表点击事件使用方法
  9. 【thm】windows内网提权之Windows PrivEsc Arena
  10. Unity为人物模型 添加动效Animator
  11. JAVA出现警告无法读取 AppletViewer 属性文件的解决方法
  12. 安装Quartus18.1 软件和Modsim仿真软件,进行数字电路的仿真与验证
  13. 将照片制作为水彩画效果
  14. 培训计算机安排工作岗位,计算机岗位实习报告
  15. Flutter入门实战教程:从0到1仿写web版掘金App (完结)
  16. 限制对比度自适应直方图均衡化算法原理、实现及效果
  17. ubuntu安装拼音输入法 sougou拼音 google拼音
  18. iMindMap中如何插入语音
  19. gRPC学习与应用(1)
  20. 电力系统 matlab程序,电力系统稳定性分析matlab程序

热门文章

  1. Hbuild - 使用海马玩模拟器调试
  2. 电商营销策略介绍,电商营销手段有哪些
  3. 化妆品行业电商平台系统解决方案
  4. python编写函数 avg(lst),参数 lst 是一个列表。函数可以返回 lst 的整数平均值,调用 avg(lst) 函数求每个学生的平均成绩。
  5. 师徒结对活动记录表计算机,幼儿园师徒结对活动记录表
  6. react-native系列(13)动画篇:Animated动画库和LayoutAnimation布局动画详解
  7. Python—完美计算个税和税后收入(求职重要参考神器)
  8. 初学solidworks,这些基础知识你必须要掌握!
  9. UEStudio V17.00.0.25 免费版 代码编辑器
  10. Chrome插件-屏蔽浏览器的百度广告