| | |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.security.MessageDigest; |
| | | import java.util.List; |
| | | |
| | | /** 桥接统一鉴权:服务令牌 + 当前登录用户 + 业务权限,缺一不可。 */ |
| | | @Component |
| | | public class SystemAgentBridgeGuard { |
| | | |
| | | public static final String PERMISSION_ITEM_IMPORT = "mdm:item:import"; |
| | | |
| | | /** 各业务模块的导入权限;会话创建与附件读取只需命中其中任意一项。 */ |
| | | public static final List<String> IMPORT_PERMISSIONS = List.of( |
| | | PERMISSION_ITEM_IMPORT, |
| | | "srm:supplier:create", |
| | | "mes:md-item:create", |
| | | "mes:qc-template:create", |
| | | "mes:pro-mps:create", |
| | | "mes:pro-route:create"); |
| | | |
| | | @Value("${yudao.agent.bridge-service-token:}") |
| | | private String bridgeServiceToken; |
| | |
| | | } |
| | | if (!securityFrameworkService.hasPermission(permission)) { |
| | | throw new AgentBridgeException(HttpStatus.FORBIDDEN, "FORBIDDEN", |
| | | "当前用户缺少物料导入权限(" + permission + ")"); |
| | | "当前用户缺少数据导入权限(" + permission + ")"); |
| | | } |
| | | return principalOf(userId); |
| | | } |
| | | |
| | | /** 会话与附件入口无法预知模块,只要求具备任意一项导入权限。 */ |
| | | public AgentPrincipal requireAny(String providedServiceToken) { |
| | | verifyServiceToken(providedServiceToken); |
| | | Long userId = SecurityFrameworkUtils.getLoginUserId(); |
| | | if (userId == null) { |
| | | throw new AgentBridgeException(HttpStatus.UNAUTHORIZED, "UNAUTHORIZED", "未登录或登录已过期"); |
| | | } |
| | | if (!securityFrameworkService.hasAnyPermissions(IMPORT_PERMISSIONS.toArray(String[]::new))) { |
| | | throw new AgentBridgeException(HttpStatus.FORBIDDEN, "FORBIDDEN", "当前用户缺少数据导入权限"); |
| | | } |
| | | return principalOf(userId); |
| | | } |
| | | |
| | | private AgentPrincipal principalOf(Long userId) { |
| | | Long tenantId = TenantContextHolder.getTenantId(); |
| | | return new AgentPrincipal(userId, tenantId == null ? 0L : tenantId, "live"); |
| | | } |