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<String> candidateIds, DmsSubjectSet subjects) {
|
if (candidateIds == null || candidateIds.isEmpty()) {
|
return;
|
}
|
List<PermissionGroupEntity> groups = permissionGroupMapper.selectEnabledByIds(candidateIds);
|
if (groups == null) {
|
return;
|
}
|
apply(groups, candidateIds, subjects);
|
}
|
|
public void resolveAll(DmsSubjectSet subjects, int maxGroups) {
|
List<PermissionGroupEntity> groups = permissionGroupMapper.selectEnabled(maxGroups + 1);
|
if (groups != null && groups.size() > maxGroups) {
|
throw DmsPermissionException.of(DmsPermissionError.INVALID_REQUEST,
|
"启用的权限组超过文件中心单次解析上限 " + maxGroups);
|
}
|
Set<String> 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<PermissionGroupEntity> groups, Collection<String> candidateIds,
|
DmsSubjectSet subjects) {
|
if (groups == null || candidateIds == null || candidateIds.isEmpty()) {
|
return;
|
}
|
Set<String> 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<String> 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<String> buildMemberTokens(DmsSubjectSet subjects) {
|
Set<String> 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<String> tokens, Collection<String> ids, String... types) {
|
for (String id : ids) {
|
for (String type : types) {
|
add(tokens, id, type);
|
}
|
}
|
}
|
|
private void add(Set<String> tokens, String id, String type) {
|
if (id != null && !id.trim().isEmpty()) {
|
tokens.add(id.trim());
|
tokens.add(id.trim() + "--" + type);
|
}
|
}
|
}
|