feat:(REQ-2699) 菜单权限支持版本号和父组件code查询

This commit is contained in:
lilong 2024-08-12 17:56:22 +08:00
parent 1db9878f27
commit a85354c677
8 changed files with 146 additions and 105 deletions

View File

@ -1,5 +1,6 @@
package cn.axzo.tyr.client.model.req;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.model.base.WorkspaceOUPair;
import lombok.AllArgsConstructor;
@ -35,6 +36,7 @@ public class ListPermissionFeatureReq {
/**
* 菜单节点的uniCode
* 查询指定组件code集合里有权限的组件code
*/
private Set<String> uniCodes;
@ -44,4 +46,19 @@ public class ListPermissionFeatureReq {
* 菜单跟页面元素绑定的类型
*/
private Set<PageElementFeatureResourceRelationTypeEnum> pageElementTypes;
/**
* 客户端版本号
*/
private Integer versionMax;
/**
* 查询菜单树节点类型
*/
private List<FeatureResourceType> featureResourceTypes;
/**
* 查询父组件code下的有权限的uniCode
*/
private String parentUniCode;
}

View File

@ -47,6 +47,17 @@ public class TreePermissionReq {
/**
* 菜单节点的uniCode
* 查询指定组件code集合里有权限的组件code
*/
private Set<String> uniCodes;
/**
* 客户端版本号
*/
private Integer versionMax;
/**
* 查询父组件code下的有权限的uniCode
*/
private String parentUniCode;
}

View File

@ -2,10 +2,11 @@ package cn.axzo.tyr.server.event.inner;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandler;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.event.payload.ProductPermissionCreatedPayload;
@ -22,12 +23,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -144,13 +145,9 @@ public class CacheProductSaasFeatureResourceHandler implements InitializingBean
return null;
}
List<ProductSaasFeatureResourceCacheService.FeatureResourceDTO> featureResourceDTOS = Lists.newArrayList(ProductSaasFeatureResourceCacheService.FeatureResourceDTO.builder()
.featureId(featureResource.getId())
.featureType(featureResource.getFeatureType())
.terminal(featureResource.getTerminal())
.uniCode(featureResource.getUniCode())
.cooperateType(relation.getDictCode())
.build());
ProductSaasFeatureResourceCacheService.FeatureResourceDTO featureResourceDTO = from(featureResource, relation);
List<ProductSaasFeatureResourceCacheService.FeatureResourceDTO> featureResourceDTOS = Lists.newArrayList(featureResourceDTO);
List<ProductSaasFeatureResourceCacheService.FeatureResourceDTO> parentPermissions = featureResource.resolvePath().stream()
.map(parentFeatureResources::get)
.filter(Objects::nonNull)
@ -160,13 +157,7 @@ public class CacheProductSaasFeatureResourceHandler implements InitializingBean
return null;
}
return ProductSaasFeatureResourceCacheService.FeatureResourceDTO.builder()
.featureId(f.getId())
.featureType(f.getFeatureType())
.terminal(f.getTerminal())
.uniCode(f.getUniCode())
.cooperateType(relation.getDictCode())
.build();
return from(featureResource, relation);
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
@ -194,6 +185,16 @@ public class CacheProductSaasFeatureResourceHandler implements InitializingBean
.collect(Collectors.toList());
}
private ProductSaasFeatureResourceCacheService.FeatureResourceDTO from(SaasFeatureResourceResp featureResource,
SaasProductModuleFeatureRelation relation) {
return ProductSaasFeatureResourceCacheService.FeatureResourceDTO.builder()
.featureId(featureResource.getId())
.featureType(featureResource.getFeatureType())
.terminal(featureResource.getTerminal())
.uniCode(featureResource.getUniCode())
.cooperateType(relation.getDictCode())
.build();
}
private Map<Long, SaasFeatureResourceResp> listSaasFeatureResource(List<SaasProductModuleFeatureRelation> productPermissions) {
@ -209,7 +210,6 @@ public class CacheProductSaasFeatureResourceHandler implements InitializingBean
// 存在pre环境更改了节点的父节点可能导致产品没有父节点的权限这里补齐父节点的权限
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(featureIds)
.needFeatureCodes(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));
@ -230,7 +230,6 @@ public class CacheProductSaasFeatureResourceHandler implements InitializingBean
// 存在pre环境更改了节点的父节点可能导致产品没有父节点的权限这里补齐父节点的权限
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.ids(parentIds)
.needFeatureCodes(true)
.build();
return saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity(), (f, s) -> s));

View File

@ -3,21 +3,14 @@ package cn.axzo.tyr.server.event.inner;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandler;
import cn.axzo.tyr.client.model.enums.DelegatedType;
import cn.axzo.tyr.server.event.payload.SaasFeatureUpsertPayload;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import com.google.common.collect.Lists;
import cn.axzo.tyr.server.job.CacheSaasFeatureJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* 缓存全量权限点因为鉴权等逻辑需要查询免授权和权限点是否存在数据量大数据库压力大
*/
@ -28,9 +21,7 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean {
@Autowired
private EventConsumer eventConsumer;
@Autowired
private SaasFeatureDao saasFeatureDao;
@Autowired
private SaasFeatureResourceService saasFeatureResourceService;
private CacheSaasFeatureJob cacheSaasFeatureJob;
@Override
public void onEvent(Event event, EventConsumer.Context context) {
@ -40,28 +31,7 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean {
if (StringUtils.isBlank(payload.getTerminal())) {
return;
}
List<SaasFeatureResourceService.SaasFeatureResourceCache> saasFeatures = saasFeatureDao.lambdaQuery()
.eq(SaasFeature::getTerminal, payload.getTerminal())
.list()
.stream()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder()
.featureId(e.getId())
.notAuth(DelegatedType.notAuth(e.getDelegatedType()))
.parentIds(e.splitPath())
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(payload.getTerminal())
.features(saasFeatures)
.build();
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO))
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
cacheSaasFeatureJob.cacheSaasFeature(payload.getTerminal());
log.info("end cached saasFeature handler rocketmq event: {}", event);
}

View File

@ -3,20 +3,14 @@ package cn.axzo.tyr.server.event.inner;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandler;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import com.google.common.collect.Lists;
import cn.axzo.tyr.server.job.CacheSaasFeatureJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* 缓存全量权限点因为鉴权等逻辑需要查询免授权和权限点是否存在数据量大数据库压力大
*/
@ -27,7 +21,7 @@ public class CacheSaasFeatureResourceHandler implements EventHandler, Initializi
@Autowired
private EventConsumer eventConsumer;
@Autowired
private SaasFeatureResourceService saasFeatureResourceService;
private CacheSaasFeatureJob cacheSaasFeatureJob;
@Override
public void onEvent(Event event, EventConsumer.Context context) {
@ -39,28 +33,7 @@ public class CacheSaasFeatureResourceHandler implements EventHandler, Initializi
}
// 直接查询缓存所有节点因为修改的代码不好改
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.terminal(payload.getTerminal())
.build();
List<SaasFeatureResourceService.SaasFeatureResourceCache> saasFeatures = saasFeatureResourceService.list(pageSaasFeatureResourceReq).stream()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder()
.featureId(e.getId())
.notAuth(SaasFeatureResource.AuthType.isAllRole(e.getAuthType()))
.parentIds(e.resolvePath())
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(payload.getTerminal())
.features(saasFeatures)
.build();
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO))
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
cacheSaasFeatureJob.cacheSaasFeatureResource(payload.getTerminal());
log.info("end cached saasFeatureResource handler rocketmq event: {}", event);
}

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.server.job;
import cn.axzo.tyr.client.model.enums.DelegatedType;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
@ -17,6 +18,7 @@ import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@Slf4j
@ -28,6 +30,11 @@ public class CacheSaasFeatureJob extends IJobHandler {
@Autowired
private SaasFeatureResourceService saasFeatureResourceService;
/**
* 分组这些菜单节点没有版本号默认为0方便权限过滤
*/
private static final int DEFAULT_VERSION = 0;
@Override
@XxlJob("CacheSaasFeatureJob")
public ReturnT<String> execute(String s) throws Exception {
@ -40,7 +47,7 @@ public class CacheSaasFeatureJob extends IJobHandler {
return ReturnT.SUCCESS;
}
private void cacheSaasFeature(String terminal) {
public void cacheSaasFeature(String terminal) {
Map<String, List<SaasFeatureResourceService.SaasFeatureResourceCache>> saasFeatures = saasFeatureDao.lambdaQuery()
.eq(StringUtils.isNotBlank(terminal), SaasFeature::getTerminal, terminal)
.list()
@ -66,9 +73,10 @@ public class CacheSaasFeatureJob extends IJobHandler {
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
}
private void cacheSaasFeatureResource(String terminal) {
public void cacheSaasFeatureResource(String terminal) {
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.terminal(terminal)
.needPageElement(true)
.build();
Map<String, List<SaasFeatureResourceService.SaasFeatureResourceCache>> saasFeatureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq)
@ -79,6 +87,13 @@ public class CacheSaasFeatureJob extends IJobHandler {
.featureId(e.getId())
.notAuth(SaasFeatureResource.AuthType.isAllRole(e.getAuthType()))
.parentIds(e.resolvePath())
.uniCode(e.getUniCode())
.version(Optional.ofNullable(e.getSaasPageElements())
.map(pageElement -> pageElement.stream()
.findFirst()
.map(PageElementResp::getVersion)
.orElse(DEFAULT_VERSION))
.orElse(DEFAULT_VERSION))
.build(), Collectors.toList())));
List<SaasFeatureResourceService.SaasFeatureResourceDTO> featureResources = saasFeatureResources.entrySet().stream()

View File

@ -107,5 +107,13 @@ public interface SaasFeatureResourceService extends IService<SaasFeatureResource
private boolean notAuth;
private Set<Long> parentIds;
private String uniCode;
/**
* 客户端版本号
* 在根据版本号查询菜单树权限的时候需要
*/
private Integer version;
}
}

View File

@ -69,6 +69,7 @@ import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -116,11 +117,9 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private final ProductModuleDao productModuleDao;
private final ProductFeatureRelationService productFeatureRelationService;
private final SaasFeatureResourceDao saasFeatureResourceDao;
private final SaasFeatureResourceService saasFeatureResourceService;
private final SaasRoleUserRelationService saasRoleUserRelationService;
private final WorkspaceProductService workspaceProductService;
private final RoleSaasFeatureResourceCacheService roleSaasFeatureResourceCacheService;
private final ProductSaasFeatureResourceCacheService productSaasFeatureResourceCacheService;
private final TyrSaasAuthService tyrSaasAuthService;
@ -381,7 +380,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
List<WorkspaceProductService.WorkspaceProduct> workspaceProducts = listWorkspaceProducts(treePermissionReq, featureIds);
//免授权
List<Long> authFreeFeatureIds = listNotAuthFeatures(treePermissionReq);
Set<Long> authFreeFeatureIds = listNotAuthFeatures(treePermissionReq);
//取交集确定权限
return mixFeatureIds(saasRoleUserV2DTOS, workspaceProducts, authFreeFeatureIds);
@ -389,7 +388,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private Set<Long> mixFeatureIds(List<SaasRoleUserV2DTO> saasRoleUsers,
List<WorkspaceProductService.WorkspaceProduct> workspaceProducts,
List<Long> authFreeFeatureIds) {
Set<Long> authFreeFeatureIds) {
Map<Long, WorkspaceProductService.WorkspaceProduct> workspaceProductMap = workspaceProducts.stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProduct::getWorkspaceId, Function.identity()));
@ -456,7 +455,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
return Collections.emptyList();
}
List<SaasFeatureResourceResp> saasFeatureResources = saasFeatureResourceService.list(PageSaasFeatureResourceReq.builder()
List<SaasFeatureResourceResp> saasFeatureResources = featureResourceService.list(PageSaasFeatureResourceReq.builder()
.ids(Lists.newArrayList(allFeatureIds))
.needFeatureCodes(true)
.terminal(req.getTerminal())
@ -514,6 +513,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
.personId(req.getPersonId())
.terminal(req.getTerminal())
.uniCodes(req.getUniCodes())
.versionMax(req.getVersionMax())
.parentUniCode(req.getParentUniCode())
.build();
Set<Long> featureIds = listUserPermissionFeatureIds(treePermissionReq);
@ -521,7 +522,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
return Collections.emptyList();
}
List<SaasFeatureResourceResp> saasFeatureResources = saasFeatureResourceService.list(PageSaasFeatureResourceReq.builder()
// 使用方需要名字iconrouterUrl等信息放在redis就数据量比较大后续要做成人维度的权限缓存所以现在就查询数据库因为有权限的权限点不多且是主键查询
List<SaasFeatureResourceResp> saasFeatureResources = featureResourceService.list(PageSaasFeatureResourceReq.builder()
.ids(Lists.newArrayList(featureIds))
.needPageElement(req.getNeedPageElement())
.pageElementTypes(req.getPageElementTypes())
@ -818,27 +820,72 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
return relations;
}
private List<SaasFeatureResourceService.SaasFeatureResourceCache> listAllFeatureResources(TreePermissionReq treePermissionReq) {
List<SaasFeatureResourceService.SaasFeatureResourceCache> allFeatureResources = featureResourceService.listCache(SaasFeatureResourceService.ListSaasFeatureResourceCache.builder()
.terminals(Sets.newHashSet(treePermissionReq.getTerminal()))
.build())
.get(treePermissionReq.getTerminal())
.stream()
.filter(f -> Objects.isNull(treePermissionReq.getVersionMax())
|| treePermissionReq.getVersionMax().compareTo(f.getVersion()) > -1)
.collect(Collectors.toList());
if (StringUtils.isBlank(treePermissionReq.getParentUniCode())) {
return allFeatureResources;
}
Optional<Long> parentId = allFeatureResources.stream()
.filter(e -> Objects.equals(e.getUniCode(), treePermissionReq.getParentUniCode()))
.map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId)
.findFirst();
return parentId.map(aLong -> allFeatureResources.stream()
.filter(e -> e.getParentIds().contains(aLong))
.collect(Collectors.toList()))
.orElse(Collections.emptyList());
}
private Set<Long> listUserPermissionFeatureIds(TreePermissionReq treePermissionReq) {
List<SaasRoleUserV2DTO> saasRoleUserV2DTOS = listUserPermission(treePermissionReq);
List<SaasFeatureResourceService.SaasFeatureResourceCache> allFeatureResources = listAllFeatureResources(treePermissionReq);
if (CollectionUtils.isEmpty(allFeatureResources)) {
return Collections.emptySet();
}
List<SaasRoleUserV2DTO> saasRoleUsers = listUserPermission(treePermissionReq);
Map<Long, List<RoleSaasFeatureResourceCacheService.SaasFeatureResourceDTO>> roleFeatureResourceMap = listRoleFeatureResource(saasRoleUsers, treePermissionReq);
List<WorkspaceProductService.WorkspaceProductFeatureSource> workspaceProductFeatureSources = listWorkspaceProducts(treePermissionReq);
//免授权
List<Long> authFreeFeatureIds = listNotAuthFeatures(treePermissionReq);
Set<Long> authFreeFeatureIds = allFeatureResources.stream()
.filter(e -> BooleanUtils.isTrue(e.isNotAuth()))
.map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId)
.collect(Collectors.toSet());
Set<Long> allFeatureIds = allFeatureResources.stream()
.map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId)
.collect(Collectors.toSet());
//取交集确定权限
return mixFeatureIds(saasRoleUserV2DTOS, workspaceProductFeatureSources, authFreeFeatureIds, treePermissionReq);
return mixFeatureIds(saasRoleUsers,
workspaceProductFeatureSources,
authFreeFeatureIds,
treePermissionReq,
roleFeatureResourceMap,
allFeatureIds);
}
private List<Long> listNotAuthFeatures(TreePermissionReq treePermissionReq) {
private Set<Long> listNotAuthFeatures(TreePermissionReq treePermissionReq) {
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.terminal(treePermissionReq.getTerminal())
.authType(FeatureResourceAuthType.ALL_ROLE.getCode())
.build();
return featureResourceService.list(pageSaasFeatureResourceReq).stream()
.map(SaasFeatureResourceResp::getId)
.collect(Collectors.toList());
.collect(Collectors.toSet());
}
private List<WorkspaceProductService.WorkspaceProductFeatureSource> listWorkspaceProducts(TreePermissionReq treePermissionReq) {
@ -894,14 +941,14 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private Set<Long> mixFeatureIds(List<SaasRoleUserV2DTO> saasRoleUsers,
List<WorkspaceProductService.WorkspaceProductFeatureSource> workspaceProducts,
List<Long> authFreeFeatureIds,
TreePermissionReq treePermissionReq) {
Set<Long> authFreeFeatureIds,
TreePermissionReq treePermissionReq,
Map<Long, List<RoleSaasFeatureResourceCacheService.SaasFeatureResourceDTO>> roleFeatureResourceMap,
Set<Long> allFeatureIds) {
Map<Long, List<WorkspaceProductService.ProductFeatureSource>> workspaceProductMap = workspaceProducts.stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductFeatureSource::getWorkspaceId, WorkspaceProductService.WorkspaceProductFeatureSource::getProductFeatureSources));
Map<Long, List<RoleSaasFeatureResourceCacheService.SaasFeatureResourceDTO>> roleFeatureResourceMap = listRoleFeatureResource(saasRoleUsers, treePermissionReq);
Set<Integer> featureTypes = Optional.ofNullable(treePermissionReq.getFeatureResourceTypes())
.map(e -> e.stream().map(FeatureResourceType::getCode).collect(Collectors.toSet()))
.orElseGet(Sets::newHashSet);
@ -914,6 +961,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
.flatMap(Collection::stream)
.filter(e -> StringUtils.isBlank(treePermissionReq.getTerminal())
|| Objects.equals(e.getTerminal(), treePermissionReq.getTerminal()))
.filter(e -> allFeatureIds.contains(e.getFeatureId()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(productFeatureSources)) {
@ -933,12 +981,12 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
Set<Long> normalFeatureIds = resolveNormalRole(productFeatureSources, saasRole, roleFeatureResources);
Set<Long> allFeatureIds = Sets.newHashSet();
allFeatureIds.addAll(adminFeatureIds);
allFeatureIds.addAll(notAuthFeatureIds);
allFeatureIds.addAll(normalFeatureIds);
Set<Long> result = Sets.newHashSet();
result.addAll(adminFeatureIds);
result.addAll(notAuthFeatureIds);
result.addAll(normalFeatureIds);
return allFeatureIds;
return result;
})
.filter(Objects::nonNull)
.flatMap(Collection::stream)
@ -981,7 +1029,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
}
private Set<Long> resolveNotAuthFeatureIds(List<ProductSaasFeatureResourceCacheService.FeatureResourceDTO> workspaceProduct,
List<Long> authFreeFeatureIds) {
Set<Long> authFreeFeatureIds) {
if (CollectionUtils.isEmpty(authFreeFeatureIds)) {
return Collections.emptySet();
@ -1006,7 +1054,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private List<Long> resolveNormalRole(WorkspaceProductService.WorkspaceProduct workspaceProduct,
SaasRoleUserV2DTO.SaasRole saasRole,
List<Long> authFreeFeatureIds) {
Set<Long> authFreeFeatureIds) {
//普通角色角色同类型的租户产品权限已分配 且角色上已分配 + 免授权
Set<Long> roleFeatureIds = Optional.ofNullable(saasRole.getPermissionRelations())
.map(e -> e.stream()