文章目录
- 数据权限
 - 接口权限
 
前言:最近博主在按照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 感谢各位。




















