文章目录
- 数据权限
- 接口权限
前言:最近博主在按照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 {
@Autowired
private DataScopeInterceptor dataScopeInterceptor;
@Bean
public 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 感谢各位。