cisd/docs/plans/2026-03-30-auth-refactor-design.md
2026-03-30 14:41:38 +08:00

314 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TMS Auth Refactor Design
**Date:** 2026-03-30
## Goal
`tms-framework` 中重构认证模块完整承接旧管理端的认证标准流程但只保留一套新规范接口与一套实现代码。重构范围只调整接口命名、DTO 字段命名、控制器职责和数据模型表达方式,不改变旧系统的业务判断顺序和安全规则。
## Confirmed Scope
本设计覆盖:
- `SUPER_ADMIN / KEY_ADMIN / AUDIT_ADMIN / OPS_ADMIN` 四个正式角色
- 口令登录与 UKey 登录两条标准流程
- 角色启用、重置密码、UKey 发行签名、UKey 绑定
- 当前会话、退出登录、修改密码
- `modules/auth/controller` 最终只保留新规范接口
本设计不覆盖:
- 前端页面重构
- PCIe / UKey 底层驱动实现重写
- 主密钥业务规则调整
- `/openapi/**` 外部接口鉴权模型
## Legacy Semantics To Preserve
### 1. Four main roles
旧系统主角色与新系统角色一一对应:
- `superadmin -> SUPER_ADMIN`
- `keyadmin -> KEY_ADMIN`
- `auditadmin -> AUDIT_ADMIN`
- `configadmin -> OPS_ADMIN`
### 2. UKey login is the standard full-auth flow
旧系统对上述四个主角色的标准登录方式是 `UKey + 角色口令`
固定 UKey 数量要求:
- `SUPER_ADMIN` 需要 3 把 UKey
- `KEY_ADMIN` 需要 2 把 UKey
- `AUDIT_ADMIN` 需要 1 把 UKey
- `OPS_ADMIN` 需要 1 把 UKey
旧系统 UKey 登录必须保留的校验顺序:
1. 角色与 `rid` 组合匹配
2. UKey 发行签名校验
3. `uid/rid` 与角色认证信息匹配
4. 主密钥状态校验
5. 后端随机数校验
6. 登录签名校验
7. 白名单校验
8. 角色口令校验
### 3. Password login is a limited-auth flow
旧系统存在口令登录链路。新系统不再保留 `KEY_ADMIN_A / KEY_ADMIN_B / auditadmin_user / configadmin_user` 这样的历史角色代码,而是将其收敛为四个主角色在 `LIMITED` 认证等级下的登录结果。
也就是说:
- 口令登录成功 -> 同一主角色的 `LIMITED` 会话
- UKey 登录成功 -> 同一主角色的 `FULL` 会话
### 4. UKey binding is still a two-step process
旧系统“绑定角色 UKey”本质上是
1. 生成发行签名
2. 绑定落库 / 写卡完成后的登记
这个两步流程必须保留,只是统一为新接口命名。
## Domain Model
### Roles
只保留四个正式角色枚举:
- `SUPER_ADMIN`
- `KEY_ADMIN`
- `AUDIT_ADMIN`
- `OPS_ADMIN`
### AuthMethod
- `PASSWORD`
- `UKEY`
### AuthLevel
- `LIMITED`
- `FULL`
关系约束:
- `PASSWORD -> LIMITED`
- `UKEY -> FULL`
`roleCode` 表达“是谁”,`authLevel` 表达“当前认证强度”。接口权限只基于 `roleCode + authLevel` 判断,不再通过附加影子角色表达。
## API Contract
只保留新规范路径,不再保留兼容旧路径控制器。
### Authentication APIs
- `POST /api/v1/auth/password-login`
- `POST /api/v1/auth/ukey-login/randoms`
- `POST /api/v1/auth/ukey-login`
- `POST /api/v1/auth/captcha`
- `GET /api/v1/auth/me`
- `POST /api/v1/auth/logout`
- `POST /api/v1/auth/change-password`
#### password-login
入参:
- `roleCode`
- `password`
- `captchaCode`
- `captchaId`
行为:
- 按旧口令登录顺序校验主密钥状态、验证码、密码和失败次数
- 成功后签发该角色的 `LIMITED` 会话
#### ukey-login/randoms
入参:
- `roleCode`
行为:
- 按角色要求下发固定数量随机数
#### ukey-login
入参:
- `roleCode`
- `password`
- `ukeyProofs[]`
单个 `ukeyProofs[]` 项包含:
- `pubKey`
- `uid`
- `rid`
- `serverRandom`
- `issueSignature`
- `loginPayload`
- `loginSignature`
行为:
- 完整保留旧项目 UKey 登录校验顺序
- 成功后签发 `FULL` 会话
### Role Administration APIs
- `POST /api/v1/auth/roles/{roleCode}/enable`
- `POST /api/v1/auth/roles/{roleCode}/reset-password`
- `POST /api/v1/auth/roles/{roleCode}/ukeys/issue-sign`
- `POST /api/v1/auth/roles/{roleCode}/ukeys/bind`
这些接口统一要求:
- `KEY_ADMIN`
- `FULL`
## Data Model
### 1. tms_auth_role_account
统一角色账户表,只保留四个主角色:
- `role_code`
- `display_name`
- `required_ukey_count`
- `password_hash`
- `password_salt`
- `status`
- `need_change_password`
- `failed_count`
- `locked_until`
- `last_login_at`
- `last_active_at`
### 2. tms_auth_role_ukey_binding
统一 UKey 绑定表:
- `role_code`
- `slot_no`
- `uid`
- `rid`
- `ukey_serial`
- `ukey_pubkey`
- `issuer_sign`
- `status`
- `bound_at`
- `unbound_at`
`slot_no`、`uid`、`rid` 是承接旧系统流程的必要字段,不能省略。
### 3. tms_auth_session
统一会话表:
- `session_token`
- `role_code`
- `auth_method`
- `auth_level`
- `issued_at`
- `last_active_at`
- `expires_at`
- `logout_at`
### 4. Captcha storage
验证码优先继续使用内存缓存,不在本次设计中新增持久化表。
## Controller Structure
`modules/auth/controller` 最终只保留一套规范控制器:
- `AuthController`
- 认证、当前会话、修改密码
- `AuthAdminController`
- 角色管理、UKey 发行签名、UKey 绑定
删除:
- `CompatAuthController`
## Service Structure
建议保留三类核心服务职责:
- `AuthService`
- `passwordLogin`
- `ukeyLogin`
- `issueUkeyLoginRandoms`
- `issueCaptcha`
- `me`
- `logout`
- `changePassword`
- `AuthAdminService`
- `enableRole`
- `resetPassword`
- `issueUkeyBindingSign`
- `bindIssuedUkey`
- `AuthPolicyService`
- 角色 UKey 数要求
- `LIMITED/FULL` 接口权限策略
- 主角色与旧登录规则映射
## Security and Permission Rules
新系统的权限表达统一为:
- `roleCode`
- `authLevel`
示例:
- `KEY_ADMIN + FULL` 可启用角色、重置角色口令、绑定 UKey
- `KEY_ADMIN + LIMITED` 只能访问受限密钥管理接口
- `AUDIT_ADMIN + LIMITED` 只能访问受限审计接口
- `AUDIT_ADMIN + FULL` 可访问完整审计接口
- `OPS_ADMIN + LIMITED` 只能访问受限运维接口
- `OPS_ADMIN + FULL` 可访问完整运维接口
- `SUPER_ADMIN + FULL` 才能访问最高敏感操作
## Migration Strategy
本次重构不是保留旧接口再适配,而是:
1. 只保留新接口
2. 在服务层完整承接旧业务流程
3. 删除 `CompatAuthController` 及其兼容 DTO/测试
4. 通过数据库迁移补齐 `uid/rid/auth_method/auth_level` 等字段
## Testing Strategy
至少覆盖:
- 口令登录成功签发 `LIMITED`
- UKey 登录成功签发 `FULL`
- UKey 数量不足失败
- `rid` 组合不匹配失败
- 发行签名校验失败
- 登录签名校验失败
- 主密钥未就绪失败
- 角色启用、重置密码、绑定 UKey 权限限制
- 删除兼容控制器后 OpenAPI 与控制器测试同步更新
## Final Decision
本次 auth 重构最终基线为:
- 只保留新规范接口
- 只保留四个正式角色
- 保留两条标准登录流程
- 使用 `authLevel` 区分认证强度和接口权限
- `auth/controller` 仅保留一套规范控制器实现