feat: manage existing credential actions with audited replay

This commit is contained in:
2026-11-01 19:10:37 +08:00
parent baa81c4923
commit 98ad60c0b8
18 changed files with 1350 additions and 53 deletions

View File

@@ -0,0 +1,39 @@
# 既有凭据权限管理回归
日期:2026-11-01。
## 功能范围
管理员通过控制台或 orbit-admin credential permissions 调整既有凭据的完整动作集合。SET_PERMISSIONS 使用 version=3 固定操作;旧动作仍使用原 v1/v2 格式,字段省略规则和历史摘要保持兼容。队列授权范围、Token 摘要及密文、有效期、旧代过渡期、资源 ID 均不改变。只更新动作集合与 revision,并将前后权限、主体、原因、固定回执同事务保存。
控制台入口仍只接受指定管理员会话与同源请求,业务 Bearer 不获得管理权限。页面使用精确动作勾选,默认保持原集合;高级核查、重试、审计与额度动作单独标识。未知动作、重复动作、通配符和空集合被拒绝;权限修改不能夹带有效期、过渡期或队列变化。
## 已执行验证
本批真库测试使用新建的一次性 MySQL 8.4 容器,核心与控制台测试各用独立数据库,没有对既有业务库执行故障注入。
| 验证 | 结果与边界 |
| --- | --- |
| 核心与历史凭据真库 race | 新权限前原 Token 调度请求为 403,授予后可实际创建计划,收回后当前/旧代 Token 均被拒绝;额外队列仍不可访问 |
| 凭据保留 | 比对秘密摘要、密文、密钥编号、有效期、过渡截止、队列 JSON;只改变明确请求的动作与 revision |
| 并发与重放 | 通过 performance_schema 确认实际数据库锁等待;同版本竞争仅一次生效,原操作重放无第二次审计,不恢复后来已收回的权限 |
| 审计失败 | 隔离库注入审计写入失败,权限、revision 和幂等回执全部回滚 |
| 兼容性 | v1/v2 固定 JSON/摘要不变;v1 → v3 → 旧回执重放 → v2 调整期限通过 |
| 控制台 HTTP 与真库 | prepare/apply 的管理员、Cookie、Origin、Fetch Metadata、严格 JSON、注销后拒绝、两代 Token 与单队列隔离通过 |
| 页面事件回归 | 执行实际 applications.js;默认精确集合、原操作重试、成功刷新、不读取 Token、其他模式及撤销状态隔离通过 |
| 管理 CLI | 动作参数校验、禁止期限参数、0600 固定文件往返通过;另在隔离库通过真实 CLI 验证 prepare-only 前后状态不变,apply 与原文件重放仅增加一次 revision,队列范围保持 |
| 标准检查 | make test、make vet、make build、make console-check、make docs-check 全部通过 |
## 复现入口与限制
```sh
make test
make vet
make build
make console-check
make docs-check
# ORBIT_TEST_MYSQL_DSN 从隔离环境私密配置加载,不指向共享业务库。
go test -race -count=1 ./internal/storage/mysql -run 'TestIntegrationCredential|TestIntegrationConsole.*Permission|TestIntegrationConsoleApplications'
```
没有新增数据库迁移、修改 SDK 协议或赋予普通凭据跨应用权限。上述验证不能替代生产多节点部署、权限变更审批和目标拓扑的正式验收;实际接入方授权记录位于工作区对接文档,不写入通用平台代码。