feat(code2identity): 实现批量查询;代码结构调整

This commit is contained in:
zhansihu 2023-10-21 15:15:02 +08:00
parent 2a3132b665
commit e8fa4686b6
5 changed files with 82 additions and 56 deletions

View File

@ -73,9 +73,5 @@ public interface RoleService {
*/
List<SaasRoleVO> queryRoleByRoleTypes(QueryByIdentityIdTypeReq req, List<String> roleTypes);
List<SaasRole> listRoleFromFeature(List<String> featureCodes, List<Long> workspaceIds);
List<SaasRole> listByOUWorkspace(Long ouId, Long workspaceId);
List<SaasRole> listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType);
}

View File

@ -84,5 +84,5 @@ public interface SaasRoleUserService {
*/
void createAgencyAdminRole(CreateAgencyAdminRoleParam param);
List<SaasRoleUserRelation> listByRoleIds(List<Long> matchedRoleIds);
List<SaasRoleUserRelation> listByRoleIds(List<Long> roleIds);
}

View File

@ -507,18 +507,6 @@ public class RoleServiceImpl implements RoleService {
return BeanUtil.copyToList(list, SaasRoleVO.class);
}
@Override
public List<SaasRole> listRoleFromFeature(List<String> featureCodes, List<Long> workspaceIds) {
//TODO:@Zhan
return null;
}
@Override
public List<SaasRole> listByOUWorkspace(Long ouId, Long workspaceId) {
//TODO:@Zhan
return null;
}
@Override
public List<SaasRole> listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType) {
return saasRoleDao.listForOUWorkspace(ouId, workspaceId, workspaceJoinType);

View File

@ -22,6 +22,7 @@ import cn.axzo.tyr.server.service.SaasRoleUserService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
@ -278,9 +279,12 @@ public class RoleUserService implements SaasRoleUserService {
}
@Override
public List<SaasRoleUserRelation> listByRoleIds(List<Long> matchedRoleIds) {
//TODO:@Zhan
return null;
public List<SaasRoleUserRelation> listByRoleIds(List<Long> roleIds) {
if (CollectionUtil.isEmpty(roleIds)) {
return new ArrayList<>();
}
return roleUserRelationDao.list(new LambdaQueryWrapper<SaasRoleUserRelation>()
.in(SaasRoleUserRelation::getRoleId, roleIds));
}
private List<SaasRoleGroupRelation> filterAgencyAdminRoleGroupRelation(CreateAgencyAdminRoleParam param) {

View File

@ -527,70 +527,96 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
@Override
public ListIdentityFromPermissionResp listIdentityFromPermission(ListIdentityFromPermissionReq req) {
Long ouId = req.getOuId();
Long workspaceId = req.getWorkspaceId();
ListIdentityFromPermissionResp result = new ListIdentityFromPermissionResp();
result.setOuId(ouId);
result.setWorkspaceId(workspaceId);
result.setUsers(new ArrayList<>());
result.setOuId(req.getOuId());
result.setWorkspaceId(req.getWorkspaceId());
//查询工作台下产品-产品包含的权限
Set<Long> workspaceFeatureIds = listWorkspaceFeatures(req.getWorkspaceId());
//code查询权限点信息
List<SaasFeature> features = permissionPointService.listNodeByCode(req.getFeatureCode(), req.getTerminal());
//权限匹配
boolean matched = false;
for (SaasFeature feature : features) {
if (workspaceFeatureIds.contains(feature.getId())) {
matched = true;
if (DelegatedType.NO_NEED.sameCode(feature.getDelegatedType())) {
//免授权 -直接返回
log.info("free permission point:{}", feature.getId());
result.setFreePermission(true);
return result;
}
}
}
if (!matched) {
//工作台没权限
log.warn("no feature found in workspace");
//权限匹配 - 工作台是否有指定权限
List<SaasFeature> matchedFeature = matchWorkspaceFeature(req.getWorkspaceId(), features);
if (CollectionUtil.isEmpty(matchedFeature)) {
log.info("no matched feature in workspace");
return result;
}
//是否免授权权限点
Optional<SaasFeature> freeFeature = matchedFeature.stream()
.filter(f -> DelegatedType.NO_NEED.sameCode(f.getDelegatedType()))
.findAny();
if (freeFeature.isPresent()) {
log.info("free feature found");
result.setFreePermission(true);
return result;
}
//从相关角色查询用户-超管和普通角色
List<ListIdentityFromPermissionResp.UserVO> users = getUsersFromRole(req, matchedFeature);
result.setUsers(users);
return result;
}
private List<SaasFeature> matchWorkspaceFeature(Long workspaceId, List<SaasFeature> features) {
//查询工作台下产品-产品包含的权限
List<ServicePkgProduct> productList = checkAndGetData(servicePkgClient.listProductInWorkSpace(workspaceId));
if (CollectionUtil.isEmpty(productList)) {
log.warn("no product found for workspace:{}", workspaceId);
return new ArrayList<>();
}
Set<Long> workspaceFeatures = checkAndGetData(productFeatureRelationService.featureListByProduct(productList.stream()
.map(ServicePkgProduct::getProductId)
.collect(Collectors.toList())))
.stream()
.map(ProductFeatureRelationVO::getFeatureId)
.collect(Collectors.toSet());
//权限匹配
return features.stream()
.filter(x -> workspaceFeatures.contains(x.getId()))
.collect(Collectors.toList());
}
private List<ListIdentityFromPermissionResp.UserVO> getUsersFromRole(ListIdentityFromPermissionReq req, List<SaasFeature> features) {
Long ouId = req.getOuId();
Long workspaceId = req.getWorkspaceId();
//查询OU-工作台下的角色
List<SaasRole> roleList = roleService.listForOUWorkspace(ouId, workspaceId, req.getWorkspaceJoinType());
//工作台超管
Set<Long> superAdmins = roleList
.stream()
.filter(r -> r.getRoleType().equals(RoleTypeEnum.SUPER_ADMIN.getValue()))
.map(SaasRole::getId)
.collect(Collectors.toSet());
//查询角色及权限
List<SaasRoleVO> rolePermissions = roleService.getByIds(roleList.stream().map(SaasRole::getId).collect(Collectors.toList()),
null, Collections.singletonList(workspaceId), Collections.singletonList(ouId), true);
Set<Long> featureIds = features.stream().map(SaasFeature::getId).collect(Collectors.toSet());
//计算角色实际的权限 - 匹配请求的权限 --> 实际拥有权限的角色
Set<Long> featureIds = features.stream().map(SaasFeature::getId).collect(Collectors.toSet());
List<SaasRoleVO> matchedRoleList = rolePermissions.stream()
.filter(rp -> rp.getMatchFeature(workspaceId, ouId).stream()
.anyMatch(f -> featureIds.contains(f.getPermissionPointId())))
.collect(Collectors.toList());
//查询角色下用户
List<Long> matchedRoleIds = matchedRoleList.stream().map(SaasRoleVO::getId).collect(Collectors.toList());
//追加工作台超管
Set<Long> superAdmins = roleList
.stream()
.filter(r -> r.getRoleType().equals(RoleTypeEnum.SUPER_ADMIN.getValue()))
.map(SaasRole::getId)
.collect(Collectors.toSet());
matchedRoleIds.addAll(superAdmins);
List<SaasRoleUserRelation> relationList = roleUserService.listByRoleIds(matchedRoleIds);
//构建用户-去重(identityId-identityType)
List<ListIdentityFromPermissionResp.UserVO> users = new ArrayList<>();
Set<String> filterSet = new HashSet<>();
for (SaasRoleUserRelation relation : relationList) {
//构建用户 - 去重
String key = relation.getIdentityId() + "-" + relation.getIdentityType();
if (!filterSet.contains(key)) {
filterSet.add(key);
ListIdentityFromPermissionResp.UserVO user = new ListIdentityFromPermissionResp.UserVO(relation.getIdentityId(),
relation.getIdentityType(), superAdmins.contains(relation.getIdentityId()));
result.getUsers().add(user);
users.add(user);
}
}
return result;
return users;
}
private Set<Long> listWorkspaceFeatures(Long workspaceId) {
@ -606,9 +632,21 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
}
@Override
public List<ListIdentityFromPermissionResp> batchListIdentityFromPermission(List<ListIdentityFromPermissionReq> req) {
public List<ListIdentityFromPermissionResp> batchListIdentityFromPermission(List<ListIdentityFromPermissionReq> reqList) {
//异步处理
return null;
List<CompletableFuture<ListIdentityFromPermissionResp>> futureList = new ArrayList<>();
for (ListIdentityFromPermissionReq req : reqList) {
CompletableFuture<ListIdentityFromPermissionResp> future = CompletableFuture.supplyAsync(
() -> this.listIdentityFromPermission(req), executor);
futureList.add(future);
}
List<ListIdentityFromPermissionResp> result = new ArrayList<>();
for (CompletableFuture<ListIdentityFromPermissionResp> future : futureList) {
result.add(future.join());
}
return result;
}
@Data