AIDAWORK / ARCHITECTURE

身份、租户与会话绑定

独立图页 ↗
机制说明(SoT)图是辅读 · 结论以说明与证据为准

Aida JWT 建立业务 principal,TenantContext 把租户和主体带入后续调用。访问业务后端所需的 credential 单独按主体获取,因此认证身份、调用上下文和后端凭证应分开阅读。

本页可直接往下读完整机制说明,不需要「演示 / 播放故事」。术语不熟先看 术语表。

先读机制说明,结论以说明与证据为准 · 基于固定代码版本核验 · 部署状态另行确认

机制说明(全文)

身份、租户与会话绑定

身份进入调用链的顺序

Aida JWT 建立业务 principal,TenantContext 把租户和主体带入后续调用。访问业务后端所需的 credential 单独按主体获取,因此认证身份、调用上下文和后端凭证应分开阅读。

SessionBinding 的 direct 结果含明确 Agent ID,routed 结果使用 null 等待路由。Admin 是独立鉴权入口。会话选路不会把业务用户变成管理员,也不能将 Server session 与本机 session 当作同一授权标识。

可选:VMS 作为账号与权限唯一来源(钉点 e2adc9a3c325,默认关)

AIDA_IAM_VMS_SOT=true 才生效,关着时上面的链路不变。打开后:

  • authMiddleware 先到服务端 IAM 会话登记表复核这次会话,不通过直接 401 IAM_SESSION_INVALID。
  • 授权用的角色换成服务端按 VMS 角色映射出的 session.roles,JWT 里的 roles 不再参与授权。
  • 会话按周期拿登录时的 VMS 令牌复核;VMS 登出或禁用即吊销,VMS 连不上超过 fail-closed 窗口(默认 5 分钟)也拒绝。
  • 会话表默认在内存;配置库里有 iam_source_sessions 表时写穿落库,但建表 SQL 还是草案。
  • 另有两个也默认关的开关:只记日志的影子比对 AIDA_IAM_SHADOW,以及按租户整体替换角色映射的覆盖层。

各环境是否打开、草案是否执行都未核实。租户覆盖层现在不能授予管理角色,覆盖层版本可读、可回滚(Agent 546db3ca7)。

Admin 操作员:不再有本地跨租户超管(钉点 e2adc9a3c325)

  • 种子账号 T11-admin 改为本地应急账号,固定为租户 11 的 tenant_admin(等同 VMS 11:26 配置管理员),库里旧值不再生效,角色与租户范围不可改;其他本地行若是 super_admin / tenant_admin 或全租户 * 一律拒绝登录。跨租户超管只能由账号源(VMS 平台超管白名单)签发;VMS 租户级管理员(AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES)只得到本租户 tenant_admin(Agent 35c3c3b93 / 1d07cf06a)。
  • Admin 会话令牌带来源声明:本地会话的版本是操作员状态(启用、角色、租户、密码 hash、updatedAt)的 HMAC,状态一变旧会话即失效;VMS 会话(平台超管或 VMS 租户级管理员)每次经 effective-permissions 复核身份、租户与在用角色并重新解析来源范围,校验不可用返回 503(admin-session.ts,随 1d07cf06a 合入)。
  • 证据:aida-agent · packages/agent/src/config/admin-operator-roles.ts L1–56 · effectiveLocalOperator · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L16–40 · localAdminSessionVersion · e2adc9a3c325
  • 未核:各环境里现有本地操作员行有多少会因此被拒;VMS 平台超管白名单在各环境的配置。

租户覆盖层、Pack 选择与 Admin 生产判定(钉点 e2adc9a3c325)

  • 覆盖层不能授予管理角色(546db3ca7):写入时拒绝 OVERLAY_RESERVED_ROLE_KEYS(platform_super_admin / tenant_admin / super_admin / product / fde);读取侧 external-iam 再用 OVERLAY_DENIED_ROLES 过滤一次,旧行也不生效。
  • 覆盖层版本与回滚:GET /tenant-adaptation/versions/:version;POST /tenant-adaptation/rollback 要求 toVersion + expectedVersion,只回到发布过且非当前的版本,先过与当前标准包的审批角色契约校验,再追加发布为新版本并审计。
  • Pack 订阅选择(1d07cf06a):followLatest / pinVersion 在 HTTP 与服务内统一校验,矛盾或格式错误时保留原订阅。Pack 发布门与 readyz 见 observability-map。
  • 生产判定:静态 admin token 在 NODE_ENV=production 或 AIDA_ENVIRONMENT 判为生产时默认禁用;没有 adminSession 声明的 admin JWT 在生产或 vms: 主体上一律失效。
  • VMS 账号登录 Admin(默认关):平台超管白名单之外新增 AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES,VMS 配置管理员可登录为本租户 tenant_admin;VMS 令牌加密留在会话里,每次请求经 effective-permissions 复核。
  • 证据:aida-agent · packages/agent/src/config/services/tenant-adaptation.ts L86–119 · OVERLAY_RESERVED_ROLE_KEYS · e2adc9a3c325;aida-agent · packages/agent/src/permission/external-iam.ts L120–128 · OVERLAY_DENIED_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/permission/external-iam.ts L214–222 · OVERLAY_DENIED_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-config.ts L2108–2166 · /tenant-adaptation/rollback · e2adc9a3c325;aida-agent · packages/agent/src/config/services/scenario-pack-service.ts L484–506 · parseTenantPackSelection · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-auth.ts L46–54 · staticTokenAllowed · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-auth.ts L92–107 · AIDA_ENVIRONMENT · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L74–90 · isProductionEnvironment · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L1–33 · tenantAdmin · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L58–72 · AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L113–190 · effective-permissions · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L140–163 · verifyVmsPlatformAdminSession · e2adc9a3c325
  • 202 环境的仓库内记录(人工记录,不是实时读取):2026-10-18 评审文档记 Jenkins dev-aida-agent-service-shanghai 已开 AIDA_ADMIN_VMS_LOGIN_ENABLED=true、AIDA_ADMIN_VMS_PLATFORM_ADMIN_ROLES=900001:1、AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES=11:26;同日执行记录把这些 IAM 配置迁到 Nacos caidaocloud-aida-config 并移除 Jenkins 的 -e,且 202 Config DB 已建 tenant_adaptations(0 行)。2026-10-11 的实测记录写 202 未声明 AIDA_ENVIRONMENT(版本信息回退为 production)。证据:aida-agent · docs/design/aidawork-vms-tenant-adaptation-iam-guide-review-20261018.md L17 · AIDA_ADMIN_VMS_LOGIN_ENABLED=true · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl L2 · tenant_adaptations · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl L5 · vms.tenant-admin-roles · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/20260930Work业务闭环实测.md L2179 · AIDA_ENVIRONMENT · e2adc9a3c325
  • 未核:Nacos 当前值、202 是否已补 AIDA_ENVIRONMENT;生产及其他环境的 AIDA_ENVIRONMENT、VMS Admin 登录开关与两份白名单;202 以外的库是否建了 tenant_adaptations。

证据与范围

  • aida-agent · packages/agent/src/gateway/auth.ts L402–432 · withTenantContext · e2adc9a3c325
  • aida-agent · docs/architecture/auth.md L12–106 · 77fe76838aa4(历史引用:该文档已在 aida-agent 44d63e20 退役,钉点 e2adc9a3c325 无此文件;见 ATLAS-DEBT)
  • aida-agent · packages/agent/src/permission/external-iam.ts L7–22 · AIDA_IAM_VMS_SOT · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/auth.ts L335–355 · IAM_SESSION_INVALID · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/session-binding.ts L54–84 · agentId: string | null·e2adc9a3c325`

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

本地 tenant_admin 与 Credits(钉点 e2adc9a3c325)

  • 迁移 189:admin_operators 角色扩到 tenant_admin,并强制具体租户作用域 CHECK。
  • 迁移 187 + admitChatCredits:chat 受理按租户/用户 Credits;耗尽有专用拒绝。生产是否开通配额、共享库是否执行 187 未核实。
  • IAM subject/permission gateway 多轮修复属业务/IAM 边界收紧,本轮不另成图;结论以代码为准,未逐项画图。

机制说明

身份、租户与会话绑定

身份进入调用链的顺序

Aida JWT 建立业务 principal,TenantContext 把租户和主体带入后续调用。访问业务后端所需的 credential 单独按主体获取,因此认证身份、调用上下文和后端凭证应分开阅读。

SessionBinding 的 direct 结果含明确 Agent ID,routed 结果使用 null 等待路由。Admin 是独立鉴权入口。会话选路不会把业务用户变成管理员,也不能将 Server session 与本机 session 当作同一授权标识。

可选:VMS 作为账号与权限唯一来源(钉点 e2adc9a3c325,默认关)

AIDA_IAM_VMS_SOT=true 才生效,关着时上面的链路不变。打开后:

  • authMiddleware 先到服务端 IAM 会话登记表复核这次会话,不通过直接 401 IAM_SESSION_INVALID。
  • 授权用的角色换成服务端按 VMS 角色映射出的 session.roles,JWT 里的 roles 不再参与授权。
  • 会话按周期拿登录时的 VMS 令牌复核;VMS 登出或禁用即吊销,VMS 连不上超过 fail-closed 窗口(默认 5 分钟)也拒绝。
  • 会话表默认在内存;配置库里有 iam_source_sessions 表时写穿落库,但建表 SQL 还是草案。
  • 另有两个也默认关的开关:只记日志的影子比对 AIDA_IAM_SHADOW,以及按租户整体替换角色映射的覆盖层。

各环境是否打开、草案是否执行都未核实。租户覆盖层现在不能授予管理角色,覆盖层版本可读、可回滚(Agent 546db3ca7)。

Admin 操作员:不再有本地跨租户超管(钉点 e2adc9a3c325)

  • 种子账号 T11-admin 改为本地应急账号,固定为租户 11 的 tenant_admin(等同 VMS 11:26 配置管理员),库里旧值不再生效,角色与租户范围不可改;其他本地行若是 super_admin / tenant_admin 或全租户 * 一律拒绝登录。跨租户超管只能由账号源(VMS 平台超管白名单)签发;VMS 租户级管理员(AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES)只得到本租户 tenant_admin(Agent 35c3c3b93 / 1d07cf06a)。
  • Admin 会话令牌带来源声明:本地会话的版本是操作员状态(启用、角色、租户、密码 hash、updatedAt)的 HMAC,状态一变旧会话即失效;VMS 会话(平台超管或 VMS 租户级管理员)每次经 effective-permissions 复核身份、租户与在用角色并重新解析来源范围,校验不可用返回 503(admin-session.ts,随 1d07cf06a 合入)。
  • 证据:aida-agent · packages/agent/src/config/admin-operator-roles.ts L1–56 · effectiveLocalOperator · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L16–40 · localAdminSessionVersion · e2adc9a3c325
  • 未核:各环境里现有本地操作员行有多少会因此被拒;VMS 平台超管白名单在各环境的配置。

租户覆盖层、Pack 选择与 Admin 生产判定(钉点 e2adc9a3c325)

  • 覆盖层不能授予管理角色(546db3ca7):写入时拒绝 OVERLAY_RESERVED_ROLE_KEYS(platform_super_admin / tenant_admin / super_admin / product / fde);读取侧 external-iam 再用 OVERLAY_DENIED_ROLES 过滤一次,旧行也不生效。
  • 覆盖层版本与回滚:GET /tenant-adaptation/versions/:version;POST /tenant-adaptation/rollback 要求 toVersion + expectedVersion,只回到发布过且非当前的版本,先过与当前标准包的审批角色契约校验,再追加发布为新版本并审计。
  • Pack 订阅选择(1d07cf06a):followLatest / pinVersion 在 HTTP 与服务内统一校验,矛盾或格式错误时保留原订阅。Pack 发布门与 readyz 见 observability-map。
  • 生产判定:静态 admin token 在 NODE_ENV=production 或 AIDA_ENVIRONMENT 判为生产时默认禁用;没有 adminSession 声明的 admin JWT 在生产或 vms: 主体上一律失效。
  • VMS 账号登录 Admin(默认关):平台超管白名单之外新增 AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES,VMS 配置管理员可登录为本租户 tenant_admin;VMS 令牌加密留在会话里,每次请求经 effective-permissions 复核。
  • 证据:aida-agent · packages/agent/src/config/services/tenant-adaptation.ts L86–119 · OVERLAY_RESERVED_ROLE_KEYS · e2adc9a3c325;aida-agent · packages/agent/src/permission/external-iam.ts L120–128 · OVERLAY_DENIED_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/permission/external-iam.ts L214–222 · OVERLAY_DENIED_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-config.ts L2108–2166 · /tenant-adaptation/rollback · e2adc9a3c325;aida-agent · packages/agent/src/config/services/scenario-pack-service.ts L484–506 · parseTenantPackSelection · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-auth.ts L46–54 · staticTokenAllowed · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-auth.ts L92–107 · AIDA_ENVIRONMENT · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L74–90 · isProductionEnvironment · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L1–33 · tenantAdmin · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L58–72 · AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES · e2adc9a3c325;aida-agent · packages/agent/src/gateway/vms-platform-admin.ts L113–190 · effective-permissions · e2adc9a3c325;aida-agent · packages/agent/src/gateway/admin-session.ts L140–163 · verifyVmsPlatformAdminSession · e2adc9a3c325
  • 202 环境的仓库内记录(人工记录,不是实时读取):2026-10-18 评审文档记 Jenkins dev-aida-agent-service-shanghai 已开 AIDA_ADMIN_VMS_LOGIN_ENABLED=true、AIDA_ADMIN_VMS_PLATFORM_ADMIN_ROLES=900001:1、AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES=11:26;同日执行记录把这些 IAM 配置迁到 Nacos caidaocloud-aida-config 并移除 Jenkins 的 -e,且 202 Config DB 已建 tenant_adaptations(0 行)。2026-10-11 的实测记录写 202 未声明 AIDA_ENVIRONMENT(版本信息回退为 production)。证据:aida-agent · docs/design/aidawork-vms-tenant-adaptation-iam-guide-review-20261018.md L17 · AIDA_ADMIN_VMS_LOGIN_ENABLED=true · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl L2 · tenant_adaptations · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl L5 · vms.tenant-admin-roles · e2adc9a3c325;aida-agent · docs/product/kerui-vms-full-scenario/20260930Work业务闭环实测.md L2179 · AIDA_ENVIRONMENT · e2adc9a3c325
  • 未核:Nacos 当前值、202 是否已补 AIDA_ENVIRONMENT;生产及其他环境的 AIDA_ENVIRONMENT、VMS Admin 登录开关与两份白名单;202 以外的库是否建了 tenant_adaptations。

证据与范围

  • aida-agent · packages/agent/src/gateway/auth.ts L402–432 · withTenantContext · e2adc9a3c325
  • aida-agent · docs/architecture/auth.md L12–106 · 77fe76838aa4(历史引用:该文档已在 aida-agent 44d63e20 退役,钉点 e2adc9a3c325 无此文件;见 ATLAS-DEBT)
  • aida-agent · packages/agent/src/permission/external-iam.ts L7–22 · AIDA_IAM_VMS_SOT · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/auth.ts L335–355 · IAM_SESSION_INVALID · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/session-binding.ts L54–84 · agentId: string | null·e2adc9a3c325`

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

本地 tenant_admin 与 Credits(钉点 e2adc9a3c325)

  • 迁移 189:admin_operators 角色扩到 tenant_admin,并强制具体租户作用域 CHECK。
  • 迁移 187 + admitChatCredits:chat 受理按租户/用户 Credits;耗尽有专用拒绝。生产是否开通配额、共享库是否执行 187 未核实。
  • IAM subject/permission gateway 多轮修复属业务/IAM 边界收紧,本轮不另成图;结论以代码为准,未逐项画图。

代码证据

引用核验检查固定 commit 的文件与范围;实现结论来自代码阅读。自动检查不证明生产环境已启用。

已核验实现

Aida JWT 建立 principal;Backend credential 与 TenantContext 分开,由调用链按主体获取。

aida-agentpackages/agent/src/gateway/auth.ts:481–5117f2e519936b57902d4907ed8026fe1ecdd146e82符号:withTenantContext
aida-agentpackages/agent/src/gateway/session-binding.ts:385–4087f2e519936b57902d4907ed8026fe1ecdd146e82符号:resolveAgentById
已核验实现

SessionBinding 返回 direct Agent ID 或 routed 的 null,不是空字符串。

aida-agentpackages/agent/src/gateway/session-binding.ts:59–897f2e519936b57902d4907ed8026fe1ecdd146e82符号:agentId: string | null
已核验实现

Admin 鉴权是独立入口,不能当作普通业务用户凭证。

aida-agentpackages/agent/src/gateway/session-binding.ts:385–4087f2e519936b57902d4907ed8026fe1ecdd146e82符号:resolveAgentById
已核验实现

可选的「VMS 作为账号与权限唯一来源」(AIDA_IAM_VMS_SOT=true 才生效,默认关):开启后 authMiddleware 先向服务端 IAM 会话登记表复核会话(失败返回 401 IAM_SESSION_INVALID),角色改用服务端映射的 session.roles,JWT 里的 roles 不参与授权;会话按周期用 VMS 令牌复核,VMS 不可达超过 fail-closed 窗口即拒绝。会话表默认内存,配置库有 iam_source_sessions 表时写穿落库(建表 SQL 仍是草案)。另有只记日志的影子比对 AIDA_IAM_SHADOW 与租户角色映射覆盖层,均默认关。

只读了代码与注释;各环境是否开启 AIDA_IAM_VMS_SOT、iam_source_sessions / tenant-adaptations 草案是否执行均未核实;本轮未运行相关测试。

aida-agentpackages/agent/src/permission/external-iam.ts:7–227f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_IAM_VMS_SOT
aida-agentpackages/agent/src/permission/external-iam.ts:120–1217f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_IAM_VMS_SOT
aida-agentpackages/agent/src/gateway/auth.ts:456–4767f2e519936b57902d4907ed8026fe1ecdd146e82符号:IAM_SESSION_INVALID
aida-agentpackages/agent/src/index.ts:1256–12687f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenantRoleMapOverlayEnabled
aida-agentpackages/agent/src/index.ts:1355–13597f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_IAM_SHADOW
aida-agentpackages/agent/src/permission/iam-session-store.ts:1–67f2e519936b57902d4907ed8026fe1ecdd146e82符号:iam_source_sessions
已核验实现

Admin 操作员身份收窄(35c3c3b93 / 1d07cf06a):本地操作员行不能再是跨租户超级管理员——种子账号 T11-admin 固定为租户 11 的 tenant_admin(本地应急账号,库里旧值不再生效,角色与租户范围不可改),其他本地行若是 super_admin / tenant_admin 或全租户 * 一律拒绝;跨租户超管只能由账号源(VMS 平台超管白名单)签发。Admin 会话令牌带来源声明:本地会话的版本是操作员状态(启用、角色、租户、密码 hash、updatedAt)的 HMAC,状态一变旧会话即失效;VMS 会话(平台超管或 VMS 租户级管理员)每次经 effective-permissions 复核身份、租户与在用角色并重新解析来源范围,校验不可用返回 503。

aida-agentpackages/agent/src/config/admin-operator-roles.ts:35–907f2e519936b57902d4907ed8026fe1ecdd146e82符号:effectiveLocalOperator
aida-agentpackages/agent/src/gateway/admin-session.ts:16–407f2e519936b57902d4907ed8026fe1ecdd146e82符号:localAdminSessionVersion
aida-agentpackages/agent/src/gateway/admin-session.ts:74–1657f2e519936b57902d4907ed8026fe1ecdd146e82符号:sourceAdminScopeStillHolds
已核验实现

租户覆盖层不能授予管理角色(546db3ca7):写入侧 parseTenantVmsRoleMap 拒绝含 OVERLAY_RESERVED_ROLE_KEYS(platform_super_admin / tenant_admin / super_admin / product / fde)的映射;读取侧 external-iam 用同一组 OVERLAY_DENIED_ROLES 再过滤一次,契约收紧前已存的旧覆盖行也不能授予这些角色。

aida-agentpackages/agent/src/config/services/tenant-adaptation.ts:96–1297f2e519936b57902d4907ed8026fe1ecdd146e82符号:OVERLAY_RESERVED_ROLE_KEYS
aida-agentpackages/agent/src/permission/external-iam.ts:144–1527f2e519936b57902d4907ed8026fe1ecdd146e82符号:OVERLAY_DENIED_ROLES
aida-agentpackages/agent/src/permission/external-iam.ts:244–2527f2e519936b57902d4907ed8026fe1ecdd146e82符号:OVERLAY_DENIED_ROLES
已核验实现

覆盖层版本读取与回滚(546db3ca7):GET /tenant-adaptation/versions/:version 读本租户某个版本;POST /tenant-adaptation/rollback(requireWrite、配置作用域头校验)要求 toVersion 与 expectedVersion,只能回到发布过且非当前的版本,先过与当前标准包的审批角色契约校验,再把历史 payload 追加发布为新版本(历史不可改)并审计 config.tenant_adaptation.rolled_back;覆盖层未启用 404,存储未建 503。

aida-agentpackages/agent/src/gateway/admin-config.ts:2137–21957f2e519936b57902d4907ed8026fe1ecdd146e82符号:/tenant-adaptation/rollback
已核验实现

Pack 订阅选择统一校验(1d07cf06a):parseTenantPackSelection 同时用于 HTTP 与服务内调用;followLatest 必须是布尔,给 pinVersion 时必须显式 followLatest,跟随最新不能带 pinVersion,固定版本要求正整数;不合法请求保留原订阅。

aida-agentpackages/agent/src/config/services/scenario-pack-service.ts:559–5997f2e519936b57902d4907ed8026fe1ecdd146e82符号:parseTenantPackSelection
已核验实现

Admin 生产判定与无声明 JWT(1d07cf06a):静态 admin token 在 NODE_ENV=production 或 AIDA_ENVIRONMENT 判为生产时默认禁用(仅 ADMIN_ALLOW_STATIC_TOKEN_IN_PRODUCTION=true 放行并告警);没有 adminSession 声明的 admin JWT 在生产环境或 sub 以 vms: 开头时一律视为会话失效(开发工具签的 JWT 只在非生产可用)。

aida-agentpackages/agent/src/gateway/admin-auth.ts:46–547f2e519936b57902d4907ed8026fe1ecdd146e82符号:staticTokenAllowed
aida-agentpackages/agent/src/gateway/admin-auth.ts:92–1077f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_ENVIRONMENT
aida-agentpackages/agent/src/gateway/admin-session.ts:74–907f2e519936b57902d4907ed8026fe1ecdd146e82符号:isProductionEnvironment
已核验实现

VMS 账号登录 Admin(默认关,AIDA_ADMIN_VMS_LOGIN_ENABLED):除平台超管白名单 AIDA_ADMIN_VMS_PLATFORM_ADMIN_ROLES 外,1d07cf06a 新增 AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES(tenant:role,如 11:26 配置管理员 → 本租户 tenant_admin),平台超管优先;登录成功后 VMS 令牌加密封入 Admin JWT(不再立即登出),每次请求经 /api/auth/v1/subject/current/effective-permissions 复核身份、租户与在用角色并重新解析来源范围(平台超管或租户管理员),不再命中返回 401/403,校验不可用 503;登录失败才尽力登出。

aida-agentpackages/agent/src/gateway/vms-platform-admin.ts:1–337f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenantAdmin
aida-agentpackages/agent/src/gateway/vms-platform-admin.ts:58–727f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES
aida-agentpackages/agent/src/gateway/vms-platform-admin.ts:113–1907f2e519936b57902d4907ed8026fe1ecdd146e82符号:effective-permissions
aida-agentpackages/agent/src/gateway/admin-session.ts:140–1637f2e519936b57902d4907ed8026fe1ecdd146e82符号:verifyVmsPlatformAdminSession
条件路径

202 环境配置的仓库内记录(不是实时读取):2026-10-18 评审文档记 Jenkins 任务 dev-aida-agent-service-shanghai 的容器参数已开 AIDA_ADMIN_VMS_LOGIN_ENABLED=true、AIDA_ADMIN_VMS_PLATFORM_ADMIN_ROLES=900001:1、AIDA_ADMIN_VMS_TENANT_ADMIN_ROLES=11:26;同日执行记录把这些 IAM 配置迁到 Nacos caidaocloud-aida-config(admin.vms-login-enabled、iam.vms.platform-admin-roles、iam.vms.tenant-admin-roles 等),并移除 Jenkins 的 9 个 -e;同一记录写明 202 Config DB 已建 tenant_adaptations(0 行)。2026-10-11 的 202 实测记录写 202 未声明 AIDA_ENVIRONMENT(版本信息回退显示 production),建议设 dev-202。

只是仓库里的人工记录,只覆盖 202;Nacos 当前值、AIDA_ENVIRONMENT 是否已补、生产及其他环境的配置都读不到。

aida-agentdocs/design/aidawork-vms-tenant-adaptation-iam-guide-review-20261018.md:17–177f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_ADMIN_VMS_LOGIN_ENABLED=true
aida-agentdocs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl:2–27f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenant_adaptations
aida-agentdocs/product/kerui-vms-full-scenario/evidence/20261018-iam-tenant-adaptation/202-optional-tables-migration.jsonl:5–57f2e519936b57902d4907ed8026fe1ecdd146e82符号:vms.tenant-admin-roles
aida-agentdocs/product/kerui-vms-full-scenario/20260930Work业务闭环实测.md:2179–21797f2e519936b57902d4907ed8026fe1ecdd146e82符号:AIDA_ENVIRONMENT
已核验实现

迁移 189:admin_operators 支持 tenant_admin 并强制具体租户作用域 CHECK。

aida-agentpackages/agent/migrations/189_local_tenant_admin.sql:21–497f2e519936b57902d4907ed8026fe1ecdd146e82符号:local-tenant-admin
条件路径

chat 受理 admitChatCredits:Credits 耗尽返回专用拒绝;依赖迁移 187 表结构。生产开通未核。

共享库是否执行 187、各租户配额是否配置未核实。

aida-agentpackages/agent/src/gateway/chat-credits.ts:14–387f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitChatCredits
aida-agentpackages/agent/src/gateway/chat-routes.ts:119–1197f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitChatCredits