diff --git a/core/core-backend/pom.xml b/core/core-backend/pom.xml index 34caa1e919..3c8beeba8a 100644 --- a/core/core-backend/pom.xml +++ b/core/core-backend/pom.xml @@ -108,11 +108,7 @@ com.h2database h2 - - org.seleniumhq.selenium - selenium-java - ${selenium-java.version} - + org.eclipse.angus angus-mail diff --git a/core/core-backend/src/main/java/io/dataease/visualization/dao/perext/ResourcePermissionMapper.java b/core/core-backend/src/main/java/io/dataease/visualization/dao/perext/ResourcePermissionMapper.java new file mode 100644 index 0000000000..4a51307862 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/visualization/dao/perext/ResourcePermissionMapper.java @@ -0,0 +1,29 @@ +package io.dataease.visualization.dao.perext; + +import io.dataease.dataset.dao.auto.entity.CoreDatasetGroup; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + + +@Mapper +public interface ResourcePermissionMapper { + + @Select("select `component_data` from data_visualization_info where id = #{id}") + String queryResourceData(@Param("id") Long id); + + @Select(""" + + """) + List queryDataSetList(@Param("viewIds") List viewIds); +} diff --git a/core/core-backend/src/main/java/io/dataease/visualization/manage/ResourcePermissionManage.java b/core/core-backend/src/main/java/io/dataease/visualization/manage/ResourcePermissionManage.java new file mode 100644 index 0000000000..675cf2c81f --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/visualization/manage/ResourcePermissionManage.java @@ -0,0 +1,141 @@ +package io.dataease.visualization.manage; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.dataease.api.dataset.union.DatasetTableInfoDTO; +import io.dataease.api.dataset.union.UnionDTO; +import io.dataease.api.report.bo.DatasetPermissionTemplate; +import io.dataease.api.report.bo.TableSysVariable; +import io.dataease.dataset.dao.auto.entity.CoreDatasetGroup; +import io.dataease.dataset.utils.DatasetTableTypeConstants; +import io.dataease.extensions.datasource.dto.DatasetTableDTO; +import io.dataease.utils.JsonUtil; +import io.dataease.visualization.dao.perext.ResourcePermissionMapper; +import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Component +public class ResourcePermissionManage { + + + @Resource + private ResourcePermissionMapper resourcePermissionMapper; + + + public static final String regex2 = "\\$f2cde\\[(.*?)\\]"; + + public List queruDatasetPermissionTemplate(Long resourceId) { + String componentDataText = resourcePermissionMapper.queryResourceData(resourceId); + TypeReference>> tokenType = new TypeReference<>() { + }; + List> componentData = JsonUtil.parseList(componentDataText, tokenType); + List> userViewList = getUserViewList(componentData); + List viewIds = userViewList.stream().filter(item -> ObjectUtils.isNotEmpty(item.get("id"))).map(item -> Long.parseLong(item.get("id").toString())).collect(Collectors.toList()); + List datasetGroups = resourcePermissionMapper.queryDataSetList(viewIds); + return getDatasetPermissionTemplate(datasetGroups); + } + + private static boolean isParams(String paramId) { + if (Arrays.asList("sysParams.userId", "sysParams.userEmail", "sysParams.userName").contains(paramId)) { + return true; + } + boolean isLong = false; + try { + Long.valueOf(paramId); + isLong = true; + } catch (Exception e) { + isLong = false; + } + if (paramId.length() >= 18 && isLong) { + return true; + } + return false; + } + + private List> getUserViewList(List> componentData) { + List> userViewList = new ArrayList<>(); + + Stack> stack = new Stack<>(); + stack.addAll(componentData); + + while (!stack.isEmpty()) { + Map node = stack.pop(); + if ("UserView".equals(node.get("component"))) { + userViewList.add(node); + } + if ("DeTabs".equals(node.get("component"))) { + Object propValueObj = null; + List> tabComponentList = null; + if (ObjectUtils.isNotEmpty(propValueObj = node.get("propValue")) && CollectionUtils.isNotEmpty(tabComponentList = (List>) propValueObj)) { + List> innerComponentList = tabComponentList.stream().filter(item -> ObjectUtils.isNotEmpty(item.get("componentData"))).flatMap(propValueItem -> { + List> mapList = (List>) propValueItem.get("componentData"); + return mapList.stream(); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(innerComponentList)) { + stack.addAll(innerComponentList); + } + } + } + } + + return userViewList; + } + + + private List getDatasetPermissionTemplate(List datasetGroups) { + TypeReference> typeReference = new TypeReference<>() { + }; + List templateList = new ArrayList<>(); + datasetGroups.forEach(group -> { + DatasetPermissionTemplate template = new DatasetPermissionTemplate(); + template.setDatasetId(group.getId()); + String info = group.getInfo(); + List unionList = JsonUtil.parseList(info, typeReference); + Stack stack = new Stack<>(); + stack.addAll(unionList); + Set dsIdSet = new HashSet<>(); + List tableSysVariables = new ArrayList<>(); + while (!stack.isEmpty()) { + UnionDTO union = stack.pop(); + DatasetTableDTO currentDs = union.getCurrentDs(); + dsIdSet.add(currentDs.getDatasourceId()); + Long currentTableId = currentDs.getId(); + if (ObjectUtils.isNotEmpty(currentDs.getType()) && currentDs.getType().equals(DatasetTableTypeConstants.DATASET_TABLE_SQL)) { + String tableInfoText = currentDs.getInfo(); + DatasetTableInfoDTO tableInfoDTO = JsonUtil.parseObject(tableInfoText, DatasetTableInfoDTO.class); + String s = new String(Base64.getDecoder().decode(tableInfoDTO.getSql())); + Pattern pattern = Pattern.compile(regex2); + Matcher matcher = pattern.matcher(s); + List sysVariables = new ArrayList<>(); + while (matcher.find()) { + String paramId = matcher.group().substring(7, matcher.group().length() - 1); + if (!isParams(paramId)) { + continue; + } + sysVariables.add(paramId); + } + if (CollectionUtils.isNotEmpty(sysVariables)) { + TableSysVariable tableSysVariable = new TableSysVariable(); + tableSysVariable.setTableId(currentTableId); + tableSysVariable.setSysVariables(sysVariables); + tableSysVariables.add(tableSysVariable); + } + } + if (CollectionUtils.isNotEmpty(union.getChildrenDs())) { + stack.addAll(union.getChildrenDs()); + } + } + template.setDsIdSet(dsIdSet); + template.setTableSysVariables(tableSysVariables); + templateList.add(template); + }); + return templateList; + } + +} diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index a06871037f..fc9c7531f1 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.api.dataset.union.DatasetTableInfoDTO; import io.dataease.api.dataset.union.UnionDTO; +import io.dataease.api.report.bo.DatasetPermissionTemplate; import io.dataease.api.template.dto.TemplateManageFileDTO; import io.dataease.api.template.dto.VisualizationTemplateExtendDataDTO; import io.dataease.api.visualization.DataVisualizationApi; @@ -68,6 +69,7 @@ import io.dataease.visualization.dao.auto.mapper.VisualizationWatermarkMapper; import io.dataease.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.dataease.visualization.manage.CoreBusiManage; import io.dataease.visualization.manage.CoreVisualizationManage; +import io.dataease.visualization.manage.ResourcePermissionManage; import io.dataease.visualization.utils.VisualizationUtils; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; @@ -1142,4 +1144,11 @@ public class DataVisualizationServer implements DataVisualizationApi { } return result; } + + @Resource + private ResourcePermissionManage resourcePermissionManage; + @Override + public List queruDatasetPermissionTemplate(Long resourceId) { + return resourcePermissionManage.queruDatasetPermissionTemplate(resourceId); + } } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/DatasetPermissionTemplate.java b/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/DatasetPermissionTemplate.java new file mode 100644 index 0000000000..36bada1c3c --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/DatasetPermissionTemplate.java @@ -0,0 +1,21 @@ +package io.dataease.api.report.bo; + +import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; +import java.util.Set; + +@Data +public class DatasetPermissionTemplate { + + private Long datasetId; + + private Set dsIdSet; + + private List tableSysVariables; + + public boolean hasSysVariable() { + return CollectionUtils.isNotEmpty(tableSysVariables); + } +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/TableSysVariable.java b/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/TableSysVariable.java new file mode 100644 index 0000000000..7af112262a --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/report/bo/TableSysVariable.java @@ -0,0 +1,17 @@ +package io.dataease.api.report.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class TableSysVariable { + + private Long tableId; + + private List sysVariables; +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java index 0e19b153c1..e7fdfeb7cd 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java @@ -3,6 +3,7 @@ package io.dataease.api.visualization; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.api.report.bo.DatasetPermissionTemplate; import io.dataease.api.visualization.dto.VisualizationViewTableDTO; import io.dataease.api.visualization.request.DataVisualizationBaseRequest; import io.dataease.api.visualization.request.VisualizationAppExportRequest; @@ -14,6 +15,7 @@ import io.dataease.auth.DeApiPath; import io.dataease.auth.DePermit; import io.dataease.model.BusiNodeRequest; import io.dataease.model.BusiNodeVO; +import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.*; @@ -170,4 +172,7 @@ public interface DataVisualizationApi { @Operation(summary = "导出图片日志记录") void exportLogImg(@RequestBody DataVisualizationBaseRequest request) throws Exception; + + @Hidden + List queruDatasetPermissionTemplate(Long resourceId); } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/ResourceAuthApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/ResourceAuthApi.java new file mode 100644 index 0000000000..10d3e75df7 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/api/ResourceAuthApi.java @@ -0,0 +1,11 @@ +package io.dataease.api.permissions.auth.api; + +import io.dataease.api.permissions.auth.dto.ResourcePermissionRequest; +import io.dataease.api.permissions.auth.vo.ResourcePermissionVO; + +import java.util.List; + +public interface ResourceAuthApi { + + List queryResourcePermission(ResourcePermissionRequest request); +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/ResourcePermissionRequest.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/ResourcePermissionRequest.java new file mode 100644 index 0000000000..41535ad9c2 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/ResourcePermissionRequest.java @@ -0,0 +1,17 @@ +package io.dataease.api.permissions.auth.dto; + +import io.dataease.api.permissions.user.vo.UserReciVO; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class ResourcePermissionRequest implements Serializable { + + private List resourceIds; + + private Integer resourceType; + + private List targets; +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourcePermissionVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourcePermissionVO.java new file mode 100644 index 0000000000..e3a34c51c1 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/vo/ResourcePermissionVO.java @@ -0,0 +1,14 @@ +package io.dataease.api.permissions.auth.vo; + +import io.dataease.api.permissions.user.vo.UserReciVO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ResourcePermissionVO extends UserReciVO implements Serializable { + private Long resourceId; + private boolean enable; +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/api/RowColPermissionApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/api/RowColPermissionApi.java new file mode 100644 index 0000000000..1f52fa1f42 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/api/RowColPermissionApi.java @@ -0,0 +1,10 @@ +package io.dataease.api.permissions.dataset.api; + +import io.dataease.api.permissions.dataset.vo.RowColPermissionItem; + +import java.util.List; + +public interface RowColPermissionApi { + + List query(List datastetIds); +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/bo/ColPermissionBo.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/bo/ColPermissionBo.java new file mode 100644 index 0000000000..3cbeae9775 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/bo/ColPermissionBo.java @@ -0,0 +1,15 @@ +package io.dataease.api.permissions.dataset.bo; + +import io.dataease.api.permissions.dataset.vo.ColPermissionInfo; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class ColPermissionBo implements Serializable { + + private boolean enable; + + private List columns; +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/ColPermissionInfo.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/ColPermissionInfo.java new file mode 100644 index 0000000000..dd5cd5613b --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/ColPermissionInfo.java @@ -0,0 +1,18 @@ +package io.dataease.api.permissions.dataset.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ColPermissionInfo implements Serializable { + + private boolean selected; + + private Long id; + + private String opt; + + private Object desensitizationRule; + +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/RowColPermissionItem.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/RowColPermissionItem.java new file mode 100644 index 0000000000..3c92b79231 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/vo/RowColPermissionItem.java @@ -0,0 +1,29 @@ +package io.dataease.api.permissions.dataset.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class RowColPermissionItem implements Serializable { + + private Long id; + + private boolean enable; + + private String authTargetType; + + private String authTargetId; + + private Long datasetId; + + private String permissionText; + + private List whiteListUserIds; + + private String type; + + private List colPermissionInfos; + +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/api/UserApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/api/UserApi.java index d6acfe3e01..ef021c245b 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/api/UserApi.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/api/UserApi.java @@ -244,4 +244,8 @@ public interface UserApi { @GetMapping("/lang") String userLang(); + + @Hidden + List getFormatRecipient(Long oid, List uidList, List ridList); + } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserReciVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserReciVO.java new file mode 100644 index 0000000000..fdc77078d8 --- /dev/null +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserReciVO.java @@ -0,0 +1,26 @@ +package io.dataease.api.permissions.user.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class UserReciVO implements Serializable { + + private Long userId; + + private List roleIds; + + private boolean hasRootRole; + + private List commonRoleIds; + + public UserReciVO(Long userId) { + this.userId = userId; + } +} diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java index 5d591de8c7..c5952e18e3 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.Map; import static io.dataease.constant.AuthResourceEnum.SYSTEM; @@ -68,4 +69,7 @@ public interface SysVariablesApi { @PostMapping("/value/batchDel") void batchDel(@RequestBody List ids); + @Hidden + Map> queryBatchSysVariable(List uids); + }