Commit bdfecd6f by 李小龙

fix:29138

parent f0806f85
...@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInt ...@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInt
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.makeit.config.mybatis.interceptor.EmptyListInterceptor; import com.makeit.config.mybatis.interceptor.EmptyListInterceptor;
import com.makeit.config.mybatis.tenant.DataScopeHandler;
import com.makeit.config.mybatis.tenant.DataScopeInterceptor;
import com.makeit.config.mybatis.tenant.FactoryTableProperties;
import com.makeit.config.mybatis.tenant.TenantIdHandler; import com.makeit.config.mybatis.tenant.TenantIdHandler;
import com.makeit.config.mybatis.tenant.TenantIdInterceptor; import com.makeit.config.mybatis.tenant.TenantIdInterceptor;
import com.makeit.config.mybatis.tenant.FactoryTableProperties;
import com.makeit.enums.CodeMessageEnum; import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.Const; import com.makeit.enums.Const;
import com.makeit.exception.BusinessException; import com.makeit.exception.BusinessException;
...@@ -43,14 +45,17 @@ public class MybatisPlusConfig { ...@@ -43,14 +45,17 @@ public class MybatisPlusConfig {
interceptor.addInnerInterceptor(new EmptyListInterceptor()); interceptor.addInnerInterceptor(new EmptyListInterceptor());
interceptor.addInnerInterceptor(tenantLineInnerInterceptor()); interceptor.addInnerInterceptor(new DataScopeInterceptor(new DataScopeHandler()));
interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor; return interceptor;
} }
...@@ -106,5 +111,4 @@ public class MybatisPlusConfig { ...@@ -106,5 +111,4 @@ public class MybatisPlusConfig {
public TenantLineInnerInterceptor tenantLineInnerInterceptor() { public TenantLineInnerInterceptor tenantLineInnerInterceptor() {
return new TenantIdInterceptor(tenantLineHandler()); return new TenantIdInterceptor(tenantLineHandler());
} }
} }
package com.makeit.config.mybatis.tenant;
import com.makeit.enums.Const;
import com.makeit.utils.request.RequestUtil;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.HexValue;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.PlainSelect;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DataScopeHandler {
/**
* 获取数据权限 SQL 片段
*
* @return JSqlParser 条件表达式
*/
public Expression getSqlSegment(PlainSelect plainSelect, String whereSegment){
Expression where = plainSelect.getWhere();
if (where == null) {
where = new HexValue(" 1 = 1 ");
}
Table fromItem = (Table) plainSelect.getFromItem();
// 有别名用别名,无别名用表名,防止字段冲突报错
Alias fromItemAlias = fromItem.getAlias();
String mainTableName = fromItemAlias == null ? fromItem.getName() : fromItemAlias.getName();
String dataScope = RequestUtil.getDataScope();
String[] orgIds = dataScope.split(Const.COMMON_SPLIT);
// 把集合转变为JSQLParser需要的元素列表
ItemsList orgIdList = new ExpressionList(Stream.of(orgIds).map(LongValue::new).collect(Collectors.toList()));
InExpression inExpression = new InExpression(new Column(mainTableName+".org_id"), orgIdList);
return new AndExpression(where, inExpression);
}
}
package com.makeit.config.mybatis.tenant;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.makeit.enums.Const;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.request.RequestUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SetOperationList;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Component
public class DataScopeInterceptor extends JsqlParserSupport implements InnerInterceptor {
private DataScopeHandler dataScopeHandler;
public DataScopeInterceptor(DataScopeHandler dataScopeHandler) {
this.dataScopeHandler = dataScopeHandler;
}
@Override
protected void processSelect(Select select, int index, String sql, Object obj) {
//platOrgId = plat_role.data_scope = org_id 逗号隔开
//请求头没有指定字段platOrgId跳过||platOrgId 为空 ||platOrgId = tenantId 跳过
String dataScope = RequestUtil.getDataScope();
String tenantId = RequestUtil.getTenantIdHeader();
if(StringUtils.isBlank(dataScope)||StringUtils.isBlank(tenantId)){
return;
}
String[] orgIds = dataScope.split(Const.COMMON_SPLIT);
List<String> orgIdList = Arrays.asList(orgIds);
if(orgIdList.contains(tenantId)){
return;
}
String tableName = ((Table) ((PlainSelect) select.getSelectBody()).getFromItem()).getName();
//没有org_id 表字段跳过
List<TableFieldInfo> fieldInfoList = TableInfoHelper.getTableInfo(tableName).getFieldList();
boolean existsOrgId = StreamUtil.anyMatch(fieldInfoList, e -> Const.ORG_ID.equals(e.getColumn()));
if(!existsOrgId){
return;
}
SelectBody selectBody = select.getSelectBody();
if (selectBody instanceof PlainSelect) {
this.setWhere((PlainSelect) selectBody, (String) obj);
} else if (selectBody instanceof SetOperationList) {
SetOperationList setOperationList = (SetOperationList) selectBody;
List<SelectBody> selectBodyList = setOperationList.getSelects();
selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj));
}
}
/**
* 设置 where 条件
*
* @param plainSelect 查询对象
* @param whereSegment 查询条件片段
*/
private void setWhere(PlainSelect plainSelect, String whereSegment) {
Expression sqlSegment = dataScopeHandler.getSqlSegment(plainSelect, whereSegment);
if (null != sqlSegment) {
plainSelect.setWhere(sqlSegment);
}
}
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {
return;
}
PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
mpBs.sql(this.parserSingle(mpBs.sql(), ms.getId()));
}
}
...@@ -22,6 +22,8 @@ public class Const { ...@@ -22,6 +22,8 @@ public class Const {
public static final String FUTURE = "期货"; public static final String FUTURE = "期货";
public static final String FUTURE_ENG = "future"; public static final String FUTURE_ENG = "future";
public static final String ORG_ID = "org_id";
// 编码 // 编码
public static final String UTF8_CHAR_ENCODING = "utf-8"; public static final String UTF8_CHAR_ENCODING = "utf-8";
......
...@@ -22,4 +22,6 @@ public class HeaderConst { ...@@ -22,4 +22,6 @@ public class HeaderConst {
public static final String ZONE_ID = "zoneId"; public static final String ZONE_ID = "zoneId";
public static final String FEIGN_NO_REMOVE="feignNoRemove"; public static final String FEIGN_NO_REMOVE="feignNoRemove";
public static final String DATA_SCOPE = "data-scope";
} }
...@@ -105,4 +105,7 @@ public class RequestUtil { ...@@ -105,4 +105,7 @@ public class RequestUtil {
// } // }
// //
public static String getDataScope(){
return getHeader(HeaderConst.DATA_SCOPE);
}
} }
...@@ -64,7 +64,7 @@ public class PushCallback implements MqttCallback { ...@@ -64,7 +64,7 @@ public class PushCallback implements MqttCallback {
DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class); DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class);
// todo // todo
//checkAlarm(device); checkAlarm(device);
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment