package com.xly.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* xlyAi 侧授权层 —— 表单级白名单(架构 §7)。
*
*
后端逐用户表单权限被关(只验登录 + 租户 + 行级),所以在 agent 侧按用户实际授权把可碰的
* 表单/菜单限制住。数据源与后端一致(`sysjurisdiction`,即 `getsAuthsIdNew` 的逻辑)——不新造。
*
*
管理员(sysadmin/admin) = 全部权限(返回 null);否则 = 该用户有权的 id 集合(菜单/表单/按钮,
* 由 `sysjurisdiction.sKey` 按 '-' 拆出)。当前本地 dev-login 以 admin 身份运行,因此实际全通;
* 生产透传用户 token 时即按各用户真实授权收紧。Read / Query / Write 共用此边界。
*/
@Service
public class AuthzService {
private final JdbcTemplate jdbc;
@Value("${erp.dev-login.username:admin}")
private String devUserNo;
@Value("${erp.dev-login.brand:1111111111}")
private String devBrand;
@Value("${erp.dev-login.subsidiary:1111111111}")
private String devSub;
@Value("${erp.dev-login.usertype:sysadmin}")
private String devUserType;
@Value("${erp.dev-login.userid:}")
private String devUserIdOverride;
public AuthzService(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
/**
* 构造 dev-login(本地开发)身份:token 为空 → ErpClient 回退 dev-login;权限集按 dev 账号解析
* (admin → null = 全部)。
*/
public com.xly.agent.AgentIdentity devIdentity() {
String uid = devUserIdOverride != null && !devUserIdOverride.isBlank() ? devUserIdOverride : resolveDevUserId();
Set granted = grantedIds(uid, devUserType, devBrand, devSub);
return new com.xly.agent.AgentIdentity(null, uid, devBrand, granted);
}
/**
* 构造透传的真实用户身份:token = 用户浏览器里的 ERP 登录 token(转发给 ERP),权限集按该用户
* 真实授权({@code sAuthsId})解析。用于生产环境按各用户真实权限收紧。
*/
public com.xly.agent.AgentIdentity userIdentity(String token, String userId,
String brandsId, String subsidiaryId, String userType) {
Set granted = grantedIds(userId, userType, brandsId, subsidiaryId);
return new com.xly.agent.AgentIdentity(token, userId, brandsId, granted);
}
/** null = 全部(管理员);否则 = 有权的 id 集合。 */
private Set grantedIds(String userId, String userType, String brandsId, String subsidiaryId) {
if (isAdmin(userType)) {
return null; // 超管全部权限
}
Set ids = new HashSet<>();
if (userId == null) {
return ids;
}
List