fix(identity): 支持平台用户显式登录 AI Gateway

修复多租户身份配置将所有人类登录都强制解释为租户上下文的问题。Web 现在提供平台与租户两个受控入口,API 严格绑定 context_type、tid、issuer、application 和 subject,并为平台用户建立独立本地投影与可刷新会话。\n\n风险:新增会话身份列保持旧会话可读,新会话一律使用严格约束;未改变租户数据隔离和 API Key 行为。\n\n验证:Go 全量测试与 go vet 通过;PostgreSQL 平台投影、会话和安全事件集成测试通过;前端 lint、141 项测试与生产 build 通过;OpenAPI 生成和迁移安全测试通过。
This commit is contained in:
2026-07-31 14:24:40 +08:00
parent 88c971564a
commit c0296dbf06
29 changed files with 1061 additions and 84 deletions
@@ -70,13 +70,30 @@ func (s *Server) resolveOIDCUserProjectionForRuntime(ctx context.Context, r *htt
return store.ResolveOrProvisionOIDCUserResult{}, errors.New("OIDC user resolver is unavailable")
}
revision := runtime.Revision
switch user.ContextType {
case "platform":
if revision.TenantMode != "multi_tenant" ||
strings.TrimSpace(user.TenantID) != "" {
return store.ResolveOrProvisionOIDCUserResult{},
errors.New("platform OIDC context is incompatible with the active identity revision")
}
case "tenant":
if strings.TrimSpace(user.TenantID) == "" {
return store.ResolveOrProvisionOIDCUserResult{},
errors.New("tenant OIDC context is missing its tenant")
}
default:
return store.ResolveOrProvisionOIDCUserResult{},
errors.New("OIDC context type is missing or invalid")
}
tenantName := ""
tenantSlug := ""
tenantMetadataStatus := ""
tenantMetadataVersion := ""
tenantMetadataETag := ""
var tenantMetadataUpdatedAt time.Time
if revision.TenantMode == "multi_tenant" {
if user.ContextType == "tenant" &&
revision.TenantMode == "multi_tenant" {
if runtime.TenantContext == nil {
return store.ResolveOrProvisionOIDCUserResult{}, errors.New("tenant context runtime is unavailable")
}
@@ -151,6 +168,7 @@ func (s *Server) resolveOIDCUserProjectionWithTenantContext(
Subject: user.ID,
Username: user.Username,
Roles: user.Roles,
ContextType: user.ContextType,
TenantID: user.TenantID,
TenantMode: revision.TenantMode,
TenantName: tenantName,