refactor(数据集): 计算字段中的 SQL 片段在传输过程中进行加密处理 #15446

This commit is contained in:
junjun
2025-03-21 17:37:48 +08:00
committed by dataeaseShu
parent bc169bc375
commit 7b63882403
7 changed files with 98 additions and 24 deletions

View File

@@ -196,7 +196,11 @@ public class DatasetDataManage {
}).collect(Collectors.toList());
}
public Map<String, Object> previewDataWithLimit(DatasetGroupInfoDTO datasetGroupInfoDTO, Integer start, Integer count, boolean checkPermission) throws Exception {
public Map<String, Object> previewDataWithLimit(DatasetGroupInfoDTO datasetGroupInfoDTO, Integer start, Integer count, boolean checkPermission, boolean encode) throws Exception {
if (encode) {
DatasetUtils.dsDecode(datasetGroupInfoDTO);
}
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, null);
String sql = (String) sqlMap.get("sql");
@@ -264,12 +268,15 @@ public class DatasetDataManage {
Map<String, Object> map = new LinkedHashMap<>();
// 重新构造data
Map<String, Object> previewData = buildPreviewData(data, fields, desensitizationList);
Map<String, Object> previewData = buildPreviewData(data, fields, desensitizationList, encode);
map.put("data", previewData);
if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getId())) {
map.put("allFields", fields);
} else {
List<DatasetTableFieldDTO> fieldList = datasetTableFieldManage.selectByDatasetGroupId(datasetGroupInfoDTO.getId());
if (encode) {
DatasetUtils.listEncode(fieldList);
}
map.put("allFields", fieldList);
}
map.put("sql", Base64.getEncoder().encodeToString(querySQL.getBytes()));
@@ -467,14 +474,14 @@ public class DatasetDataManage {
// 重新构造data
List<TableField> fList = (List<TableField>) data.get("fields");
List<DatasetTableFieldDTO> fields = transFields(fList, false);
Map<String, Object> previewData = buildPreviewData(data, fields, new HashMap<>());
Map<String, Object> previewData = buildPreviewData(data, fields, new HashMap<>(), false);
Map<String, Object> map = new LinkedHashMap<>();
map.put("data", previewData);
map.put("sql", Base64.getEncoder().encodeToString(sql.getBytes()));
return map;
}
public Map<String, Object> buildPreviewData(Map<String, Object> data, List<DatasetTableFieldDTO> fields, Map<String, ColumnPermissionItem> desensitizationList) {
public Map<String, Object> buildPreviewData(Map<String, Object> data, List<DatasetTableFieldDTO> fields, Map<String, ColumnPermissionItem> desensitizationList, boolean isEncode) {
Map<String, Object> map = new LinkedHashMap<>();
List<String[]> dataList = (List<String[]>) data.get("data");
List<LinkedHashMap<String, Object>> dataObjectList = new ArrayList<>();
@@ -502,6 +509,10 @@ public class DatasetDataManage {
}
}
if (isEncode) {
DatasetUtils.listEncode(fields);
}
map.put("fields", fields);
map.put("data", dataObjectList);
return map;

View File

@@ -14,6 +14,7 @@ import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableMapper;
import io.dataease.dataset.dao.ext.mapper.CoreDataSetExtMapper;
import io.dataease.dataset.dao.ext.po.DataSetNodePO;
import io.dataease.dataset.dto.DataSetNodeBO;
import io.dataease.dataset.utils.DatasetUtils;
import io.dataease.dataset.utils.FieldUtils;
import io.dataease.dataset.utils.TableUtils;
import io.dataease.datasource.dao.auto.entity.CoreDatasource;
@@ -86,9 +87,12 @@ public class DatasetGroupManage {
@Transactional
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetGroupInfoDTO, boolean rename) throws Exception {
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetGroupInfoDTO, boolean rename, boolean encode) throws Exception {
lock.lock();
try {
if (encode) {
DatasetUtils.dsDecode(datasetGroupInfoDTO);
}
boolean isCreate;
// 用于重命名获取pid
if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getPid()) && ObjectUtils.isNotEmpty(datasetGroupInfoDTO.getId())) {
@@ -138,6 +142,9 @@ public class DatasetGroupManage {
datasetTableManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), tableIds);
datasetTableFieldManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), fieldIds);
}
if (encode) {
DatasetUtils.dsEncode(datasetGroupInfoDTO);
}
return datasetGroupInfoDTO;
} catch (Exception e) {
DEException.throwException(e.getMessage());
@@ -339,7 +346,7 @@ public class DatasetGroupManage {
if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getUnion())) {
return;
}
datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 1, false);
datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 1, false, false);
// table和field均由前端生成id如果没有id
Long datasetGroupId = datasetGroupInfoDTO.getId();
List<DatasetTableFieldDTO> allFields = datasetGroupInfoDTO.getAllFields();
@@ -480,7 +487,7 @@ public class DatasetGroupManage {
if ("preview".equalsIgnoreCase(type)) {
// 请求数据
Map<String, Object> map = datasetDataManage.previewDataWithLimit(dto, 0, 100, true);
Map<String, Object> map = datasetDataManage.previewDataWithLimit(dto, 0, 100, true, false);
// 获取data,sql
Map<String, List> data = (Map<String, List>) map.get("data");
String sql = (String) map.get("sql");

View File

@@ -1,12 +1,8 @@
package io.dataease.dataset.server;
import io.dataease.api.dataset.DatasetDataApi;
import io.dataease.api.dataset.dto.BaseTreeNodeDTO;
import io.dataease.api.dataset.dto.EnumValueRequest;
import io.dataease.api.dataset.dto.MultFieldValuesRequest;
import io.dataease.api.dataset.dto.PreviewSqlDTO;
import io.dataease.api.dataset.dto.*;
import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
import io.dataease.api.dataset.dto.EnumObj;
import io.dataease.dataset.manage.DatasetDataManage;
import io.dataease.extensions.datasource.dto.DatasetTableDTO;
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
@@ -29,7 +25,7 @@ public class DatasetDataServer implements DatasetDataApi {
@Override
public Map<String, Object> previewData(DatasetGroupInfoDTO datasetGroupInfoDTO) throws Exception {
return datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 100, false);
return datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 100, false, true);
}
@Override

View File

@@ -33,19 +33,19 @@ public class DatasetTreeServer implements DatasetTreeApi {
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)
@Override
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetNodeDTO) throws Exception {
return datasetGroupManage.save(datasetNodeDTO, false);
return datasetGroupManage.save(datasetNodeDTO, false, true);
}
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)
@Override
public DatasetNodeDTO rename(DatasetGroupInfoDTO dto) throws Exception {
return datasetGroupManage.save(dto, true);
return datasetGroupManage.save(dto, true, false);
}
@DeLog(id = "#p0.id", pid = "#p0.pid", ot = LogOT.CREATE, st = LogST.DATASET)
@Override
public DatasetNodeDTO create(DatasetGroupInfoDTO dto) throws Exception {
return datasetGroupManage.save(dto, false);
return datasetGroupManage.save(dto, false, true);
}
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)

View File

@@ -1,15 +1,15 @@
package io.dataease.dataset.utils;
import io.dataease.api.dataset.dto.BaseTreeNodeDTO;
import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
import io.dataease.engine.constant.ExtFieldConstant;
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
import io.dataease.utils.TreeUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -53,4 +53,64 @@ public class DatasetUtils {
});
return result;
}
public static String getEncode(String str) {
return Base64.getEncoder().encodeToString(str.getBytes());
}
public static String getDecode(String str) {
return new String(Base64.getDecoder().decode(str));
}
/**
* 计算字段表达式base64加密
*
* @param obj
*/
public static void dsEncode(DatasetGroupInfoDTO obj) {
for (DatasetTableFieldDTO dto : obj.getAllFields()) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getEncode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64加密
*
* @param obj
*/
public static void dsDecode(DatasetGroupInfoDTO obj) {
for (DatasetTableFieldDTO dto : obj.getAllFields()) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getDecode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64加密
*
* @param fields
*/
public static void listEncode(List<DatasetTableFieldDTO> fields) {
for (DatasetTableFieldDTO dto : fields) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getEncode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64解密
*
* @param fields
*/
public static void listDecode(List<DatasetTableFieldDTO> fields) {
for (DatasetTableFieldDTO dto : fields) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getDecode(dto.getOriginName()));
}
}
}
}

View File

@@ -544,7 +544,7 @@ public class ExportCenterManage implements BaseExportApi {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap);
Map<String, Object> previewData = datasetDataManage.buildPreviewData(provider.fetchResultField(datasourceRequest), allFields, desensitizationList);
Map<String, Object> previewData = datasetDataManage.buildPreviewData(provider.fetchResultField(datasourceRequest), allFields, desensitizationList, false);
List<Map<String, Object>> data = (List<Map<String, Object>>) previewData.get("data");
if (p.equals(0L)) {
detailsSheet = wb.createSheet("数据" + s);

View File

@@ -261,7 +261,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
datasetFolderNewRequest.setName(datasetFolderName);
datasetFolderNewRequest.setNodeType("folder");
datasetFolderNewRequest.setPid(datasetFolderPid);
DatasetGroupInfoDTO datasetFolderNew = datasetGroupManage.save(datasetFolderNewRequest, false);
DatasetGroupInfoDTO datasetFolderNew = datasetGroupManage.save(datasetFolderNewRequest, false, false);
Long datasetFolderNewId = datasetFolderNew.getId();
//新建数据集
appData.getDatasetGroupsInfo().forEach(appDatasetGroup -> {
@@ -815,8 +815,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (CollectionUtils.isEmpty(datasourceVOInfo)) {
DEException.throwException("当前不存在数据源无法导出");
} else if(datasourceVOInfo.stream()
.anyMatch(datasource -> DatasourceConfiguration.DatasourceType.API.name().equals(datasource.getType()))){
} else if (datasourceVOInfo.stream()
.anyMatch(datasource -> DatasourceConfiguration.DatasourceType.API.name().equals(datasource.getType()))) {
DEException.throwException(Translator.get("i18n_app_error_no_api"));
}