status: implemented_pending_environment_e2e_review created: 2026-08-01 complexity: 🔴复杂
现有统一能力开放平台已经具备 REST 网关、OAuth/HMAC 认证、客户端授权、限流、幂等和审计能力,但执行端仍只识别低代码业务动作与对象流程动作;能力文档仅提供 OpenAPI JSON 且当前前端下载为空;管理员完成客户端与授权配置后,也无法直接判断是否可调用或复制一条正确请求。
本变更目标:
suite/object/action 来源键解耦为可扩展执行适配层,保留现有业务动作、流程动作行为。SYSTEM_SERVICE 能力来源。系统服务只能由代码显式注册,管理端不可填写任意 URL、Bean 名或请求目标。/mcp 签发的 Token 被误用于 REST 开放网关,同时保持 MCP 兼容。SYSTEM_SERVICE 注册来源查询、发布和网关调用。tenantId、userId、activeOrgId、initiator 或流程 modelKey。开放网关通过执行适配器集合解析已发布能力,而不再自行拆解低代码来源键。每个适配器必须:
sourceType 与 behavior。ExecutionIdentity 上下文内执行。首批适配器:
| 适配器 | 来源类型 | 兼容性 |
|---|---|---|
| 业务动作适配器 | BUSINESS_ACTION + ACTION |
保持现有低代码动作调用 |
| 对象流程适配器 | FLOW_ACTION + FLOW |
保持现有对象流程 START/APPROVE 等调用 |
| 系统服务适配器 | SYSTEM_SERVICE + ACTION |
新增,仅执行代码注册的服务定义 |
系统服务定义由 Spring Bean 代码注册,每项必须声明:
serviceCode、名称、描述和版本。管理端只能从注册表中选择服务并填写该服务显式允许的发布参数。未知 serviceCode、重复注册、发布快照缺失或注册定义变化均拒绝发布或调用。
发布参数由管理员选择已发布且启用的 sys_flow_model。发布版本策略快照固定:
serviceCode=flow.process.startmodelId、modelKey、模型版本及部署标识requiredActorType=USER外部请求只允许:
businessKey:外围业务唯一键。title:可选流程标题。variables:发布时允许的变量集合。执行前重新校验模型仍为已发布/启用状态且关键快照一致;真实用户、租户、组织从 USER 委托身份获取。调用 FlowClient.startProcessForDelegatedUser(...),并复用流程服务基于 tenant + businessKey 的幂等约束。
文档只从当前已发布不可变版本读取:inputSchema、outputSchema、policySnapshot、actor type、behavior、risk level 和版本信息。业务说明存入 policySnapshot.documentation:
{
"documentation": {
"businessRules": ["..."],
"requestNotes": ["..."],
"responseNotes": ["..."]
}
}
Markdown 包含概述、地址/版本、主体要求、认证方式、Header、递归入参/返回参数表、示例、业务规则、权限、幂等/限流、错误码、OAuth/HMAC 示例和排障说明。OpenAPI 3.1 继续用于机器导入;Idempotency-Key 仅作为 Header,不得出现在请求 Body Schema 中。
/oauth2/token 404 的半开启状态。recordId 必须引用已保存且当前委托用户可见的真实业务记录;资源不存在不再误报为 Schema 错误。FLOW_ACTION/SUBMIT 业务申请能力,一次调用完成低代码业务记录创建和主流程发起;已有记录 START 保留为高级动作。requestId 排障且不记录 Token、密钥和业务报文。OPEN_PAGE/新增 不再被误认为可开放业务动作,申请类对象可从诊断一键切换到 FLOW_ACTION/SUBMIT。ACTOR_TYPE_NOT_ALLOWED。modelKey/modelId/tenantId/userId/activeOrgId/initiator 不属于流程启动请求 Schema;额外字段由 Schema 校验拒绝。/oauth2/token 和 /openapi/v1/capabilities/:code/invoke 链路,不得提供绕过认证、授权、限流、幂等或业务校验的测试后门。ACTION/FLOW/MESSAGE/EXTERNAL 在线测试属于真实副作用操作,必须二次确认并自动生成一次性 Idempotency-Key。currentVersion 对应版本仍存在且为 PUBLISHED;不自动恢复已撤销授权。kid 和版本。sub 默认由管理员预绑定到 Forge 普通用户;管理员可为具体客户端显式启用已验签手机号唯一匹配,但始终禁止传 Forge userId/tenantId/roleId/permission,禁止自动绑定管理员身份。jti 并通过 Redis 一次性校验;验签、防重放或用户目录不可用时失败关闭。subject_token_type,不得在验签失败后相互回退。/oauth2/** 与 /openapi/v1/capabilities/** 使用 Capability 自有认证,不得由通用操作日志或租户拦截器把 fdu_ Token 当作 Sa-Token 解析。sub,同一映射后续调用复用;显式启用手机号规则时只能使用验签通过的 phone_number 做租户内唯一匹配,不得把客户端自报 sub/userId 直接解释为任意 Forge 用户。tenantId 建立租户上下文并强制关闭租户忽略,结束后恢复原线程上下文。<=> 运算符。审计服务必须以已校验的显式 tenantId 自行建立并恢复租户上下文,强制 ignoreTenant=false;可跳过不适用于审计基础设施的用户 DataScope,但不得跳过租户隔离。审计异常日志只记录请求标识、能力编码和异常堆栈,不记录 Token、密钥或业务报文。PINNED 授权。管理员可在授权管理中显式调整基准版本或切换为 FOLLOW_MAJOR,服务端必须按目标版本重新校验字段/操作策略后才能保存。FLOW_ACTION 授权版本与当前版本的 bindingId/flowModelKey/publishedObjectVersion 快照不一致时,必须在发起真实测试前显示 FLOW_BINDING_MISMATCH 的中文原因并阻断;管理员可在调用指南内显式切换授权基准到当前版本,平台不得在发布时静默升级授权。FLOW_ACTION/START 只允许为已经保存的业务记录启动流程,不负责创建业务数据。recordId 必须是绑定业务对象的真实正整数主键,且该记录必须在实际委托用户的数据权限范围内;不存在或不可见统一返回 HTTP 404 + RESOURCE_NOT_FOUND,不得归类为 SCHEMA_INVALID,也不得透露记录是否真实存在。FLOW_ACTION/SUBMIT 是外围系统默认使用的申请提交能力,请求只包含已发布版本允许的业务字段;tenantId/userId/createBy/status/businessKey/processInstanceId 等身份、审计和流程字段不得由调用方覆盖。Idempotency-Key。记录创建和执行日志中的 recordId 检查点必须在同一独立事务提交;流程启动失败后重试只能继续使用该记录,禁止重复建单。远程流程已成功而本地回填失败时继续依赖稳定 objectCode:recordId 恢复。recordId/businessKey/processInstanceId/flowModelKey/flowStatus 及字段级说明;文档必须说明每个请求和返回字段的业务含义、约束、示例、身份来源与主要业务校验。requestId/capabilityCode/version/clientId/clientCode/actorType/actorUserId/tenantId/activeOrgId/resultCode/httpStatus/schemaPath/durationMs 等安全元数据,不记录 Authorization、Secret、签名、Nonce 原文或请求/响应 Body。OPEN_PAGE 新增/编辑/删除只表示页面交互,不得因为名称为“新增”就推断为服务端创建记录能力;流程入口、页面操作和包含执行步骤的自动化必须分层展示。申请类业务对象对外建单统一推荐 FLOW_ACTION/SUBMIT。CapabilitySchemaValidator 尚未实现的 Schema 关键字,也不得通过放宽内核白名单静默丢弃约束语义。无法由当前 Schema 子集表达的格式、精度和默认值必须进入字段说明,并由流程适配器和低代码运行时继续强制校验。RuntimeException 捕获业务 action;Schema、授权和业务校验异常必须原样交回网关映射。只有 Redis 锁、幂等快照读取和快照写入异常返回 503,且控制台日志必须输出安全的 phase/exceptionType 与异常链,不记录幂等键或业务报文。ai_capability_flow_operation 字典维护,前端不得写死选项;但能力注册等关键配置入口每次打开必须绕过 SPA 长生命周期缓存重新读取字典,不能要求管理员清浏览器缓存才能看到部署新增项。int(11)、bigint unsigned、decimal(18,2) 等写法;流程动作和业务动作不得分别维护不一致的映射表。columnName 是存储实现;动态查询、写入、内部动作和读取回显必须按发布模型显式完成双向映射,禁止在字段编码与列名不同时退化为简单 camelCase/snake_case 猜测。recordId 检查点后,流程启动事务必须读取到该已提交记录;不得因 MySQL REPEATABLE_READ 旧快照把刚创建的记录误报为不存在。外围 USER 委托身份必须直接参与数据权限上下文解析,不能额外依赖 Sa-Token 登录态。jti 防重放和 phone_number 格式校验全部通过后,才能在可信客户端配置下执行租户内唯一匹配。userId。| 操作 | 接口 | 方法 | 说明 |
|---|---|---|---|
| 修改 | /ai/capability/:id/openapi |
GET | 保留 OpenAPI 3.1 JSON 下载 |
| 新增 | /ai/capability/:id/document |
GET | 默认下载 Markdown 调用文档 |
| 新增 | /ai/capability/:id/call-guide |
GET | 按客户端返回就绪诊断与安全调用示例 |
| 新增 | /ai/capability/enable/:id |
POST | 校验当前发布版本后重新启用已停用能力 |
| 新增 | /ai/capability/system-service/registration-source |
GET | 返回可注册系统服务及受控参数来源 |
| 新增 | /ai/capability/system-service/publish |
POST | 发布受控系统服务能力 |
| 修改 | /oauth2/token |
POST | resource 参数支持独立 OpenAPI resource |
| 新增 | /ai/capability/client/:id/user-assertion |
GET | 查看客户端用户断言协议和脱敏映射 |
| 新增 | /ai/capability/client/:id/user-assertion/key/rotate |
POST | 生成/轮换 RSA-2048 密钥,PKCS#8 私钥仅一次返回 |
| 新增 | /ai/capability/client/:id/user-assertion/disable |
POST | 停用用户断言并递增客户端凭据版本 |
| 新增 | /ai/capability/client/:id/user-assertion/mapping |
POST | 预绑定外围 sub 到 Forge 普通用户 |
| 新增 | /ai/capability/client/:id/user-assertion/mapping/:mappingId |
DELETE | 解除外围用户映射 |
| 新增 | /ai/capability/:id/version-draft |
GET | 获取当前发布快照和下一语义版本建议,用于受控发布新版本 |
| 新增 | /ai/capability/grant/update/:id |
POST | 显式更新有效授权的版本策略、基准版本和字段策略 |
| 新增 | /ai/capability/grant/use-current-version/:id |
POST | 保留授权策略、字段策略和有效期,将授权基准显式切换到能力当前版本 |
| 新增 | /ai/capability/update/:id |
POST | 只修改能力目录名称、描述和可见性 |
| 新增 | /ai/capability/delete/:id |
DELETE | 校验停用及无有效授权后逻辑删除能力 |
| 新增 | /ai/capability/client/:id |
GET | 客户端工作台读取单个客户端详情 |
| 新增 | /ai/capability/client/:id/user-assertion/mapping/page |
GET | 分页搜索客户端外围用户映射 |
| 新增 | /ai/capability/client/:id/user-assertion/mapping-rule |
POST | 显式切换预绑定或可信手机号唯一匹配规则 |
| 新增 | /ai/capability/invocation/:id |
GET | 查询调用人、失败阶段和脱敏错误摘要详情 |
| 不变 | /openapi/v1/capabilities/:capabilityCode/invoke |
POST | 外部统一调用入口不变 |
forge:
capability:
identity:
resource: ${FORGE_CAPABILITY_MCP_RESOURCE:http://localhost:8580/mcp}
openapi-resource: ${FORGE_CAPABILITY_OPENAPI_RESOURCE:http://localhost:8580/openapi}
user-assertion-max-ttl: ${FORGE_CAPABILITY_USER_ASSERTION_MAX_TTL:2m}
user-assertion-clock-skew: ${FORGE_CAPABILITY_USER_ASSERTION_CLOCK_SKEW:30s}
resource 保留为 MCP resource 以兼容存量配置;REST 网关只接受 openapi-resource。
系统服务及流程模型固定信息、业务文档写入已存在的能力版本 Schema/policy_snapshot;能力来源继续使用 source_type/source_key/source_version。
新增 Flyway V1.0.79__add_capability_client_user_assertion.sql:客户端表增加用户断言开关、kid、X.509 PEM 公钥和密钥版本;外部身份映射增加脱敏 subject_hint。私钥和原始外围 sub 均不落库,已有逻辑删除唯一索引继续允许解除后重新绑定。
新增 Flyway 权限资源迁移 V1.0.77__add_capability_system_service_permissions.sql,为系统服务来源查询和受控发布接口补充菜单/API 权限资源;新增 V1.0.78__add_capability_catalog_dicts.sql,补齐能力来源类型与行为类型中文字典。脚本均使用 tenant_id=1 和 NOT EXISTS 防重复保护,不包含业务数据表结构变更。
新增 Flyway V1.0.81__add_capability_flow_submit_operation.sql,向 ai_capability_flow_operation 增加“提交业务申请(SUBMIT)”并设为默认操作,原“发起已有记录流程(START)”保留为高级操作。脚本只调整内置字典,不保存任何客户数据或调用参数。
新增 Flyway V1.0.82__improve_capability_client_workbench.sql:客户端增加用户断言映射模式,调用日志增加失败阶段和脱敏错误摘要;新增外围用户映射模式字典,把客户端菜单升级为工作台并隐藏旧授权/日志独立菜单。脚本保留兼容路由,内置数据使用 tenant_id=1 且具备防重复保护。
管理员在能力目录应能完成以下闭环:
.md 可读到完整入参、返回参数、业务校验和错误排查;下载 .json 可导入 OpenAPI 工具。sub 预绑定到 Forge 普通用户。sub 后由浏览器临时生成两分钟 JWT。subject_token_type、固定 claims 和完整 Java 17 RS256 签名/Token Exchange/能力调用代码。PINNED 可切换到新版本,或改为 FOLLOW_MAJOR,无需先撤销再重建授权。HTTP 400。recordId,只填写 data 中的业务字段;一次成功调用同时返回新记录 ID 和流程实例 ID。requestId 串联入口、客户端、用户、能力版本、授权结果、幂等结果、最终状态和耗时;控制台不得出现 Token、密钥和完整业务报文。schemaPath 与失败阶段,不得被幂等层误报为 503。Idempotency-Key 时复用检查点记录,不重复建单。FOLLOW_SYSTEM 数据权限使用 Token 对应的委托用户、角色和当前组织进行判断。kid/iss/aud/client_id、过期/超长 TTL、jti 重放、Redis 不可用、未映射用户、管理员用户、密钥轮换/停用与 OIDC 无回退。RESOURCE_NOT_FOUND,不创建孤立流程实例;在线测试展示可操作提示。int/int(11)/bigint unsigned/decimal(18,2) 及 NUMBER/MONEY/SWITCH 等语义时生成正确 JSON Schema;桌面字段页顶部保存能提交当前属性面板变更。本变更扩展外部调用边界,属于权限敏感变更,需人工审查。代码回滚时可先停用所有客户端用户断言,再回滚身份验证、控制面和前端代码;V1.0.79 新增列可保留为未使用兼容字段,避免破坏已执行的 Flyway 历史。既有 OIDC、业务动作、对象流程动作和 REST 网关路径保持兼容,客户端断言验签失败不会回退到 OIDC。