1. 在使用MybatisPlusInterceptor想对数据权限做限制,但是发现使用寻常的配置,在执行sql后也不会被拦截 代码如下:
@Configuration public class MybatisPlusConfig { public MybatisPlusInterceptor setMybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new DataPermissionInterceptor(new MyDataPermissionHandler())); return interceptor; }
}
执行sql语句后拦截器没有反应
@Slf4j
public class MyDataPermissionHandler implements DataPermissionHandler {
@Override
@SneakyThrows
public Expression getSqlSegment(Expression where, String mappedStatementId) {
// 超级管理员不受数据权限控制
Class<?> clazz = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(StringPool.DOT)));
String methodName = mappedStatementId.substring(mappedStatementId.lastIndexOf(StringPool.DOT) + 1);
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
DataPermission annotation = method.getAnnotation(DataPermission.class);
if (ObjectUtils.isNotEmpty(annotation)
&& (method.getName().equals(methodName) || (method.getName() + "_COUNT").equals(methodName))) {
return dataScopeFilter(annotation.dataScope(), annotation.deptAlias(), annotation.deptIdColumnName(), annotation.userAlias(), annotation.userIdColumnName(), where);
}
}
return where;
}
/**
* 构建过滤条件
*
* @param where 当前查询条件
* @return 构建后查询条件
*/
@SneakyThrows
public static Expression dataScopeFilter(DataPermissionEnum dataScopeEnum, String deptAlias, String deptIdColumnName, String userAlias, String userIdColumnName, Expression where) {
String deptColumnName = StrUtil.isNotBlank(deptAlias) ? (deptAlias + StringPool.DOT + deptIdColumnName) : deptIdColumnName;
String userColumnName = StrUtil.isNotBlank(userAlias) ? (userAlias + StringPool.DOT + userIdColumnName) : userIdColumnName;
TspUserInfo tspUserInfo = ThreadContext.getSubject();
if (dataScopeEnum == null) {
String dataPermission = tspUserInfo.getDataPermission();
// 获取当前用户的数据权限
dataScopeEnum = DataPermissionEnum.getByCode(dataPermission);
}
//部门ID 包含多个部门,同一个用户的部门来源于用户组
String orgCode = tspUserInfo.getOrgCode();
String userId = tspUserInfo.getUserId();
String acctOrgCode = tspUserInfo.getAcctOrgCode();
List<String> dataPermissionOrgCodes = tspUserInfo.getDataPermissionOrgCodes();
String appendSqlStr;
switch (Objects.requireNonNull(dataScopeEnum)) {
case Org:
// appendSqlStr = deptColumnName + " in (" + orgCode + ")";
appendSqlStr = deptColumnName + StringPool.EQUALS + orgCode;
break;
case Personal:
appendSqlStr = userColumnName + StringPool.EQUALS + userId;
break;
case AcctOrg:
appendSqlStr = userColumnName + StringPool.EQUALS + acctOrgCode;
break;
// 默认部门及子部门数据权限
default:
appendSqlStr = deptColumnName + " in (" + String.join(",", dataPermissionOrgCodes) + ")";
break;
}
if (StrUtil.isBlank(appendSqlStr)) {
return where;
}
Expression appendExpression = CCJSqlParserUtil.parseCondExpression(appendSqlStr);
if (where == null) {
return appendExpression;
}
return new AndExpression(where, appendExpression);
}
}
2. 就认为是拦截器没有起作用,后面同事大哥给了一个解决方法
@Slf4j
public class SqlSessionFactoryBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof SqlSessionFactory) { //所有bean初始化之后都会进入这个方法,这个时候需要滤出需要的类型,比如这次就只需要拿到SqlSessionFactory类型的对象对其设置拦截器就行了
SqlSessionFactory nowBean = (SqlSessionFactory) bean;
nowBean.getConfiguration().addInterceptor(new RowVersionUpdateInterceptor());
nowBean.getConfiguration().addInterceptor(setMybatisPlusInterceptor());
}
return bean; //完成后返回出去,可能直接进入容器,也可能会去执行其他的BeanPostProcessor
}
public MybatisPlusInterceptor setMybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new DataPermissionInterceptor(new MyDataPermissionHandler()));
return interceptor;
}
}
直接在注册Bean的时候,将SqlSessionFactory相关的bean都加上拦截器,然后再把SqlSessionFactoryBeanPostProcessor 注册到ioc中
@Configuration
public class MybatisPlusConfig {
@Bean
public SqlSessionFactoryBeanPostProcessor sqlSessionFactoryBeanPostProcessor() {
return new SqlSessionFactoryBeanPostProcessor();
}
}
3.可以解决问题,但是又不知道这个问题出在哪里,因为我之前都是这样配的,且重新搭建一个新的环境按照原来的方法依然可以,等我了解后问题,在来加更。。。。。。
4261

被折叠的 条评论
为什么被折叠?



