release: FL 2.0 候选(C01 记账边界+P2-2 认领协议+D10 变量契约+D11 资格终审+D09 激活代次+T01/T03/T04/T05)
按《FL最终代码审计与上线阻断清单》194 项已审计工作树形成候选,基座 = origin/main 11e0778。
- 源码/测试/资源:沿用已审计工作树内容(96 项相对远端为新增或更新),含未跟踪实现
CallbackFactStore、CallbackSourcePolicy、VariableContract、FormalApplyCommandService、
FlowActorContextGate 等;C01 续验夹具修正一并入内。
- CI:保留远端 11e0778 的门禁强化(CI_SOURCE_SHA 核对、容器回收验证、空 schema 反向门禁、
main ref 才推镜像);ci/flow-test-schema.sql 按当前实体重新生成(14→20 表,补 6 新表与
6 新列,回调日志复合唯一键 uk_flw_log_event_reg),workflow 表数断言同步 14→20。
- 依据:docs/tasks/evidence/FL-final-audit-20261027(194 项哈希/版本核对)。
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package com.yunhai.flowcenter.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.yunhai.platform.apistd.BizException;
|
||||
import com.yunhai.platform.openapi.base.OpenApiAppClient;
|
||||
import com.yunhai.platform.utils.exception.ErrorCode;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class FlowSourcePrincipalResolver {
|
||||
private final OpenApiAppClient appClient;
|
||||
|
||||
public Principal resolve(String authenticatedAppKey) {
|
||||
if (authenticatedAppKey == null || authenticatedAppKey.trim().isEmpty()) {
|
||||
throw new BizException(ErrorCode.UNAUTHORIZED, "缺少已认证的调用应用");
|
||||
}
|
||||
JsonNode app = appClient.getAppByKey(authenticatedAppKey);
|
||||
if (app == null || !app.path("id").isIntegralNumber()) {
|
||||
throw new BizException(ErrorCode.UNAUTHORIZED, "调用应用主体不可解析");
|
||||
}
|
||||
String source = app.path("sourcePrincipalId").asText("");
|
||||
try {
|
||||
if (!UUID.fromString(source).toString().equals(source)) throw new IllegalArgumentException();
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new BizException(ErrorCode.UNAUTHORIZED, "UserBase 稳定来源尚未迁移,禁止回退到数字 ID/appKey");
|
||||
}
|
||||
return new Principal(source, app.path("id").intValue(), authenticatedAppKey,
|
||||
app.path("appCode").isTextual() ? app.path("appCode").textValue() : null);
|
||||
}
|
||||
|
||||
@lombok.RequiredArgsConstructor
|
||||
public static class Principal {
|
||||
public final String id;
|
||||
public final Integer appId;
|
||||
public final String appKey;
|
||||
public final String appCode;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user