mirror of
https://github.com/dataease/dataease.git
synced 2026-05-15 05:22:13 +08:00
refactor(数据集): 计算字段中的 SQL 片段在传输过程中进行加密处理 #15446
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user