当前位置: 首页 > news >正文

【springblade】springblade(bladeX) 数据权限失效原因分析

文章目录

  • 数据权限
  • 接口权限

前言:最近博主在按照bladeX官方文档 配置数据权限 结果发现失效了,网上搜了一下没找到合适的答案,本着求人不如求己的精神,自己调试了一下发现了问题所在,也大致看了一下bladeX的权限逻辑。

数据权限

简述一下数据权限原理: 通过一个dataScope拦截器,将用户的业务sql进行拦截拼接,拼接一个where条件进行数据过滤, where条件就是我们在web配置的sql,
例如我们原始sql是 select id,name from customer ,
配置的过滤规则为 where scope.name = ‘admin’,
拼接后就是 select * from ( select id,name from customer) scope where scope.name = ‘admin’

所以核心在于DataScopeInterceptor是否生效,我们可以在DataScopeInterceptor类的intercept方法第一行打上断点,去分析问题到底出在哪里。
在这里插入图片描述
博主是连这个方法都没有进来,一时间有点懵,因为短时间不可能去看大量源码,找到所有的调用链路。

(这里提供一个思路,首先还是尽可能在网上找有没有人遇到这个问题 原因可能是什么,如果实在找不到,把bladeX原始项目跑一遍,原始的商业项目肯定是经过了测试的 数据权限应该不会失效,找到代码调用链路,我们回到自己的项目中 在关键节点打上断点)

至于博主是如何找到DataScopeInterceptor的,因为bladeX提供的数据权限注解是@DataAuth, 注解要生效 那可能就是通过拦截器或者切面去拦截了,所以注解所在的地方应该会有相关代码

在这里插入图片描述

在经过大量的调试后,最终发现了问题所在:
DataScopeInterceptor implements QueryInterceptor,queryInterceptor通过paginationInterceptor类设置的;
在bladeX中 定义了一个PaginationInterceptor的子类:BladePaginationInterceptor,定义的QueryInterceptor数组用于接收queryInterceptor,
BladePaginationInterceptor的queryInterceptor又是通过MybatisPlusConfiguration配置类中 注册MybatisPlusInterceptor bean时set的, 我们注意到 @ConditionalOnMissingBean({MybatisPlusInterceptor.class}) , 而我们项目中,通常都会自定义 MybatisPlusInterceptor , 这就导致了bladeX的配置未生效。

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

解决方案:修改我们自定义的MybatisPlusInterceptor , 代码示例:

@Configuration
public class MybatisPlusExternalConfig {@Autowiredprivate DataScopeInterceptor dataScopeInterceptor;@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(ObjectProvider<List<InnerInterceptor>> innerInterceptors) {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();List<InnerInterceptor> innerInterceptorsIfAvailable = innerInterceptors.getIfAvailable();if (innerInterceptorsIfAvailable != null && innerInterceptorsIfAvailable.size() > 0) {for (InnerInterceptor innerInterceptor : innerInterceptorsIfAvailable) {interceptor.addInnerInterceptor(innerInterceptor);}}/*** {@link  org.springblade.core.mp.config.MybatisPlusConfiguration#mybatisPlusInterceptor}* {@link  org.springblade.core.datascope.interceptor.DataScopeInnerInterceptor}*/BladePaginationInterceptor paginationInnerInterceptor = new BladePaginationInterceptor();// 核心步骤paginationInnerInterceptor.setQueryInterceptors(new DataScopeInterceptor[]{dataScopeInterceptor});interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}}

接口权限

bladeX的接口权限原理也比较简单

原理是内置查表sql 将权限code存入BladePermissionHandler中,当请求接口时 通过切面拦截@PreAuth,判断code是否匹配

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

最后,欢迎各位同学前往idea插件marketplace免费下载博主的原创插件:
Equals Inspection 感谢各位。

在这里插入图片描述

http://www.lryc.cn/news/304315.html

相关文章:

  • 单例模式的几种实现方式
  • 鸿蒙OS运行报错 ‘ToDoListItem({ item })‘ does not meet UI component syntax.
  • React18源码: reconciler执行流程
  • mapbox面图层标注
  • MySQL|MySQL基础(求知讲堂-学习笔记【详】)
  • 10.docker exec -it /bin/bash报错解决、sh与bash区别
  • 查询数据库的编码集Oracle,MySQL
  • 电商数据采集+跨境电商|API电商数据采集接口洞悉数字新零售发展
  • linux之用户和用户组
  • 人工智能深度学习
  • python reshape 和 transpose的区别
  • 音视频技术-网络视频会议“回声”的消除
  • 有哪些令人惊讶的心理学效应
  • 二叉树基础知识总结
  • IDEA2023.3.4开启SpringBoot项目的热部署【简单明了4步操作】
  • QT中调用python
  • Sora基础知识学习
  • 开源博客项目Blog .NET Core源码学习(9:Autofac使用浅析)
  • Go语言中的TLS加密:深入crypto/tls库的实战指南
  • 网络原理-TCP/IP(7)
  • HarmonyOS4.0系列——08、整合UI常用组件
  • 【Spring Boot 3】【JPA】一对多单向关联
  • 工信部等九部门:打造一批实现制造过程数字孪生的数字化转型标杆工厂
  • 并发编程(2)基础篇-管程
  • OpenAI文生视频大模型Sora概述
  • [linux]进程间通信(IPC)———共享内存(shm)(什么是共享内存,共享内存的原理图,共享内存的接口,使用演示)
  • Go 原子操作有哪些?
  • 爬虫知识--02
  • SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测
  • Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型