package jnpf.dmsPermission; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import jnpf.dmsMapper.DmsPermissionGroupMapper; import jnpf.permission.entity.PermissionGroupEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @Component @RequiredArgsConstructor public class DmsPermissionGroupMembershipResolver { private final DmsPermissionGroupMapper permissionGroupMapper; public void resolve(Collection candidateIds, DmsSubjectSet subjects) { if (candidateIds == null || candidateIds.isEmpty()) { return; } List groups = permissionGroupMapper.selectEnabledByIds(candidateIds); if (groups == null) { return; } apply(groups, candidateIds, subjects); } public void resolveAll(DmsSubjectSet subjects, int maxGroups) { resolveAll(Collections.singletonList(subjects), maxGroups); } public void resolveAll(Collection subjects, int maxGroups) { if (subjects == null || subjects.isEmpty()) { return; } List groups = permissionGroupMapper.selectEnabled(maxGroups + 1); if (groups != null && groups.size() > maxGroups) { throw DmsPermissionException.of(DmsPermissionError.INVALID_REQUEST, "启用的权限组超过文件中心单次解析上限 " + maxGroups); } Set ids = new HashSet<>(); if (groups != null) { for (PermissionGroupEntity group : groups) { if (group != null && group.getId() != null) { ids.add(group.getId()); } } } for (DmsSubjectSet subject : subjects) { if (subject != null) { apply(groups, ids, subject); } } } private void apply(List groups, Collection candidateIds, DmsSubjectSet subjects) { if (groups == null || candidateIds == null || candidateIds.isEmpty()) { return; } Set memberTokens = buildMemberTokens(subjects); for (PermissionGroupEntity group : groups) { if (group == null || group.getId() == null || !candidateIds.contains(group.getId())) { continue; } if (Integer.valueOf(0).equals(group.getType()) || containsMember(group.getPermissionMember(), memberTokens)) { subjects.getPermissionGroupIds().add(group.getId()); } } } private boolean containsMember(String members, Set subjectTokens) { if (members == null || members.trim().isEmpty()) { return false; } String[] tokens = members.split(","); for (String token : tokens) { if (subjectTokens.contains(token.trim())) { return true; } } return false; } private Set buildMemberTokens(DmsSubjectSet subjects) { Set tokens = new HashSet<>(); addUser(tokens, subjects.getUserId()); addAll(tokens, subjects.getDirectOrgIds(), "org", "subOrg", "progenyOrg"); addAll(tokens, subjects.getImmediateParentOrgIds(), "subOrg", "progenyOrg"); addAll(tokens, subjects.getAncestorOrgIds(), "progenyOrg"); addAll(tokens, subjects.getPositionIds(), "pos", "subPos", "progenyPos"); addAll(tokens, subjects.getImmediateParentPositionIds(), "subPos", "progenyPos"); addAll(tokens, subjects.getAncestorPositionIds(), "progenyPos"); addAll(tokens, subjects.getDirectUserRoleIds(), "role"); addAll(tokens, subjects.getPlatformGroupIds(), "group"); return tokens; } private void addAll(Set tokens, Collection ids, String... types) { if (ids == null) { return; } for (String id : ids) { for (String type : types) { addTyped(tokens, id, type); } } } private void addUser(Set tokens, String id) { if (id != null && !id.trim().isEmpty()) { tokens.add(id.trim()); tokens.add(id.trim() + "--user"); } } private void addTyped(Set tokens, String id, String type) { if (id != null && !id.trim().isEmpty()) { tokens.add(id.trim() + "--" + type); } } }