You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.6 KiB

package com.crm.auth.security;
import com.crm.base.security.DataVisibility;
import com.crm.base.security.DataVisibilityContext;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* 权限解析结果一次 resolve 拿齐一个用户的三份授权事实ADR-0011
*
* <p>不可变纯取值对象装载 {@link DataVisibilityContext} 是请求生命周期所有者
* JWT 过滤器的职责本对象不产生副作用</p>
*
* <ul>
* <li>{@link #getVisibility()} 数据可见性部门集合 + 档位 + 子树展开</li>
* <li>{@link #getPermCodes()} 权限码并集停用权限点已全局断路不进并集</li>
* <li>{@link #getRoleCodes()} 角色编码集合</li>
* </ul>
*/
public final class PermissionGrant {
/** Spring Security 角色 authority 前缀(hasRole('X') 实际匹配 ROLE_X) */
private static final String ROLE_PREFIX = "ROLE_";
private final DataVisibility visibility;
private final Set<String> permCodes;
private final Set<String> roleCodes;
public PermissionGrant(DataVisibility visibility, Set<String> permCodes, Set<String> roleCodes) {
this.visibility = visibility;
this.permCodes = permCodes == null ? Set.of() : Set.copyOf(permCodes);
this.roleCodes = roleCodes == null ? Set.of() : Set.copyOf(roleCodes);
}
public DataVisibility getVisibility() {
return visibility;
}
/** 权限码并集:button 节点 perms 的去重集合,已排除停用权限点 */
public Set<String> getPermCodes() {
return permCodes;
}
/** 角色编码集合(原样,不带 ROLE_ 前缀约定) */
public Set<String> getRoleCodes() {
return roleCodes;
}
/**
* 合成 Spring Security authorities权限码原样注入角色编码幂等归一到 ROLE_ 前缀
* 已带前缀的不重复加使 hasAuthority / hasRole 各自按约定匹配
* 前缀约定由本模块保证调用方与 DB 数据无需理解它
*/
public List<SimpleGrantedAuthority> asAuthorities() {
List<SimpleGrantedAuthority> authorities = new ArrayList<>(permCodes.size() + roleCodes.size());
permCodes.forEach(perm -> authorities.add(new SimpleGrantedAuthority(perm)));
roleCodes.forEach(role -> authorities.add(new SimpleGrantedAuthority(normalizeRole(role))));
return List.copyOf(authorities);
}
private static String normalizeRole(String roleCode) {
return roleCode.startsWith(ROLE_PREFIX) ? roleCode : ROLE_PREFIX + roleCode;
}
}