变更名:
mcp-user-delegation-identity状态:done 原则:OAuth/MCP HARD-GATE → 数据模型 → 授权码/令牌 → Forge 上下文 → Streamable HTTP → 验证 执行约束:TDD;禁止 commit/push;未确认 Spec 前不写业务代码
forge-ai-hub-control-plane 已归档为 done;2025-06-18 Authorization 与 Transport 官方规范;V1.0.22;| Task | 状态 | 结果 |
|---|---|---|
| 1 | 完成(受限 Profile) | 禁止 SAS;Sa-Token OAuth2 也未引入;依赖树、隔离测试和 Admin JAR 扫描均无对应依赖 |
| 2–4 | 完成 | Identity 模块、V1.0.22、精确 redirect、PKCE code、USER/SERVICE 短期 Token 与实时失效已实现 |
| 5–6 | 完成 | 显式执行身份、双身份审计、MCP 专用认证 Filter 与单 /mcp Streamable HTTP 已实现 |
| 7 | 完成 | 简洁授权确认页、登录返回、后端可信 redirect 和前端审计脱敏已实现 |
| 8 | 完成(条件项除外) | 模块测试、聚合打包、前端构建和静态扫描通过;真实 MySQL/Redis/浏览器 E2E 待 Review |
fdu_ 经 Filter、Identity Lifecycle、MCP initialize/call、双身份审计和 finally 清理的聚合测试;覆盖完整 Sa-Token 排除链。LoginUser.permissions 接入 Token scope/Capability 调用授权,保留 ping 的显式统一授权例外,禁止未来业务能力只凭 Token 自报 scope 放行。user.activeOrgId == client.activeOrgId,组织不一致不签发 code。目标:在写实现前确定可证明合规的授权服务器方案,禁止手写不完整 OAuth。
检查文件:
forge-server/forge-framework/forge-dependencies/pom.xmlforge-server/forge-framework/forge-starter-parent/forge-starter-auth/pom.xmlforge-server/forge-framework/forge-plugin-parent/forge-plugin-mcp/pom.xmlforge-server/forge-admin-server/pom.xml步骤:
1.38.0 与 1.45.0 的公开模型/handler,不运行真实网络授权;spring-security-oauth2-authorization-server 与对应能力测试;/mcp 已切换为短期令牌;真实 Redis 并发和完整 E2E 作为条件验收项保留。命令:
cd forge-server
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -Penable-tests -pl forge-framework/forge-plugin-parent/forge-plugin-capability-identity -am test
创建/修改文件:
forge-server/forge-framework/forge-plugin-parent/forge-plugin-capability-identity/pom.xmlforge-server/forge-framework/forge-plugin-parent/forge-plugin-capability-identity/src/main/java/com/mdframe/forge/plugin/capability/identity/**forge-server/forge-framework/forge-plugin-parent/pom.xmlforge-server/forge-framework/forge-dependencies/pom.xmlforge-server/forge-admin-server/pom.xmlforge-server/db/migration/V1.0.22__add_mcp_user_delegation_identity.sql步骤:
@TableLogic、Mapper XML、唯一键和 tenant 条件按规范实现并完成静态验证;ai_capability_oauth_redirect_uri、ai_capability_access_token;oauth_enabled/oauth_client_type,默认关闭 OAuth,历史机器客户端不自动开放 USER 授权;tenant_id 与 del_flag=0;xmllint、placeholder、tenant 0、物理 DELETE、无列名 INSERT 和版本唯一检查。创建文件:
.../identity/oauth/McpProtectedResourceMetadataController.java.../identity/oauth/McpAuthorizationServerMetadataController.java.../identity/oauth/CapabilityAuthorizationController.java.../identity/oauth/DelegationAuthorizationCodeStore.java.../identity/oauth/RedisDelegationAuthorizationCodeStore.java.../identity/oauth/OAuthRequestValidator.java步骤:
创建文件:
.../identity/token/CapabilityAccessTokenCodec.java.../identity/token/CapabilityAccessTokenService.java.../identity/token/CapabilityTokenController.java.../identity/token/CapabilityTokenAuthenticator.java.../identity/security/CapabilitySecurityPrincipal.java步骤:
fdu_<keyId>_<secret>,TTL 默认 600 秒、最大 900 秒,HMAC 常量时间比较;IUserLoadService,严格校验用户状态、租户成员、当前组织,禁止组织回退;创建/修改文件:
forge-server/forge-framework/forge-starter-parent/forge-starter-core/src/main/java/com/mdframe/forge/starter/core/context/ExecutionIdentityContextHolder.javaforge-server/forge-framework/forge-starter-parent/forge-starter-core/src/main/java/com/mdframe/forge/starter/core/session/SessionHelper.javaforge-server/forge-framework/forge-starter-parent/forge-starter-log/src/main/java/com/mdframe/forge/starter/log/aspect/OperationLogAspect.javaforge-server/forge-framework/forge-starter-parent/forge-starter-orm/src/test/java/.../InjectionMetaObjectHandlerTest.java步骤:
SessionHelper 统一取值;SessionHelper 优先读取显式身份,普通 Sa-Token 登录行为保持不变;SessionHelper 获取 A,不再只检查 StpUtil.isLogin();创建/修改文件:
forge-server/forge-framework/forge-plugin-parent/forge-plugin-mcp/src/main/java/com/mdframe/forge/plugin/mcp/security/ForgeMcpAuthenticationFilter.java.../identity/mcp/CapabilityMcpAccessTokenResolver.java.../identity/mcp/McpExecutionContextLifecycleFilter.javaforge-server/forge-framework/forge-starter-parent/forge-starter-auth/src/main/java/com/mdframe/forge/starter/auth/config/SaTokenConfig.javaforge-server/forge-admin-server/src/main/java/com/mdframe/forge/admin/bridge/CapabilityMcpCallerContextResolver.java步骤:
/mcp 排除通用 Sa-Token/API 权限拦截,但专用 OAuth Filter 更早强制认证;WWW-Authenticate,scope 不足返回 403;/mcp Streamable HTTP,拒绝 SSE/STATELESS/stdio。创建/修改文件:
forge-admin-ui/src/views/ai/mcp-authorize.vueforge-admin-ui/src/api/ai/capability-oauth.jsforge-admin-ui/src/router/index.jsforge-admin-ui/src/router/guards/tab-guard.js步骤:
access_denied;步骤:
test-spec.md 完成 Review R1–R6 的 Red/Green、授权交集、撤销和上下文泄漏增量测试;真实 Redis 并发仍为条件验收;fdu_ → /mcp initialize → list/call → 双身份审计聚合链;metadata → authorize → token 的真实 Redis/DB 全闭环仍为条件验收;/review,复审通过前不进入 forge-ai-hub-secure-actions。/review mcp-user-delegation-identity。