解决RuoYiPro的mybatisPuls中由于数据权限问题自动在sql后拼接 “and null” 的问题

文章讲述了在RuoYiPro项目中,使用mybatisPlus遇到因数据权限问题导致SQL自动拼接`andnull`的情况。问题源于DataPermissionDatabaseInterceptor的拦截逻辑,未正确获取到数据权限。解决方案是修复数据权限获取流程,并强调了日志的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决RuoYiPro的mybatisPuls中由于数据权限问题自动在sql后拼接 “and null” 的问题

问题复现:

在这里插入图片描述

问题描述:

由于开启了多租户功能,所以再查询部门表的时候会自动拼接上Tenant_id,用于隔离不同租户单位的数据,但是又多拼接了 “and null”

问题排查:

首先debug,定位到拼接sql的地方,既mybatisPlus的sql拦截器(InnerInterceptor)

在这里插入图片描述

由DataPermissionDatabaseInterceptor类实现了mybatisPlus的拦截器,会调用到对应的sql类型的实现方法,比如select或update等等,然后构建MPBoundSql类执行sql操作,在执行sql操作之前,对sql进行拦截,并拼接需要的sql,即通过调用parseSingle()函数进行解析sql

在这里插入图片描述
在这里插入图片描述

再判断出是select类型时,调用DataPermissionDatabaseInterceptor类重写的processSelect()方法,而不是当前的this方法(当前方法直接抛出异常,就是如果不重写就抛异常)

在这里插入图片描述

诡异的地方出来了,在处理mainTable的时候调用了一个builderExpression()的函数,看名称应该是构建条件参数的,点进去看,破案了

在这里插入图片描述
这里会判断一下查询的表是否有数据权限控制,如果有,还要查询当前用户的数据权限是否符合
在这里插入图片描述
依次点进去看会看到构建参数的过程
在这里插入图片描述
在这里插入图片描述
出问题的关键就在这里,由于没有获取到数据权限,这里会返回一个null的数组,导致后续sql拼接的时候出现 “and null”的情况,成功破案

最终的解决方案:

原本的逻辑是没问题的,问题的根源就在于没有查到数据权限的数据,之所以没有查到,是因为数据不在这里维护,得改从其他地方查

PS:
这个问题排查了很久,但是如果把执行的sql的日志打出来会更容易排查,我这次也是忽略了日志,导致做了很多多余的排查,

在这里插入图片描述

就是这个日志,打印的日志太长了导致没看完全,以为不重要以至于忽略了,

这个也有解决方法:
在这里插入图片描述

加一个换行符合解决。
以上就是这次非Admin账号的数据库执行命令拼接了and null 问题的解决思路和过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值