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.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) { 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()); } } } apply(groups, ids, subjects); } 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<>(); add(tokens, subjects.getUserId(), "user"); addAll(tokens, subjects.getDirectOrgIds(), "organize", "org", "subOrg"); addAll(tokens, subjects.getAncestorOrgIds(), "organize", "org", "progenyOrg"); addAll(tokens, subjects.getPositionIds(), "position", "pos", "subPos", "progenyPos"); addAll(tokens, subjects.getRoleIds(), "role"); addAll(tokens, subjects.getPlatformGroupIds(), "group"); return tokens; } private void addAll(Set tokens, Collection ids, String... types) { for (String id : ids) { for (String type : types) { add(tokens, id, type); } } } private void add(Set tokens, String id, String type) { if (id != null && !id.trim().isEmpty()) { tokens.add(id.trim()); tokens.add(id.trim() + "--" + type); } } }