# IAM 重构 Smoke 测试清单

> 配合 `09-iam-security.md` + `09-iam-rollout-runbook.md` 使用。
> 适用范围：dev / UAT / staging 任一环境部署 PR #138 后的快速健康检查。
> 工具：Playwright MCP（推荐）+ `docker exec` 直查 DB / Redis。

## 前置条件

- Postgres + Redis 容器已起，schema 已应用，seed 已跑
- Caddy 反代已配置（dev: `https://workspace.test.jiachentao.com/`）
- backend / frontend 进程已起且能访问

## 测试入口

- 主域：`https://workspace.test.jiachentao.com/`（dev）
- 测试账号 1：`itadmin` / `Admin@2024`（账密登录，Administrator 角色）
- 测试账号 2：dev-email-login 白名单内邮箱（开发期免密走 SSO 流程）

---

## 🟢 必跑（5 分钟）

| # | 检查 | 操作 | 预期 |
|---|---|---|---|
| 1 | **登录拿到 access + refresh** | 提交账密 / 邮箱 → 提交 | localStorage 同时有 `token` 和 `refresh_token`；F12 Network /auth/login 响应含 `refreshToken` 字段 |
| 2 | **JWT payload 瘦身** | 复制 `token`，jwt.io 解码 | payload 只有 `sub` / `jti` / `iat` / `exp`，**无** `username` / `email` / `roles` |
| 3 | **TTL = 30min** | 同上看 payload 的 exp - iat | 等于 1800 |
| 4 | **业务页面正常** | 浏览：组织架构 / 用户列表 / 部门 / 任意业务模块 | 数据正常加载，无 401/403/500 飙升 |
| 5 | **登出旧 token 失效** | 退出 → 把记下的 token 写回 localStorage → 刷新 | 跳回登录页（黑名单生效）|
| 6 | **后端日志干净** | 看 backend 终端 | 无 Redis connection error / DataScope error / relation does not exist |

---

## 🟡 关键回归（5~10 分钟）

| # | 检查 | 操作 | 预期 |
|---|---|---|---|
| 7 | **30min 自动续期** | 临时改 `JWT_ACCESS_TTL=30s` 重启 backend → 登录 → 等 35s 发请求 | F12 Network 看到 401 → /auth/refresh → 自动重发原请求 200 |
| 8 | **iam_audit_log 写入** | itadmin 操作几个权限 API → DB 查 | `SELECT actor, action, resource FROM platform_iam.iam_audit_log` 有 ADMIN_BYPASS 记录 |
| 9 | **ForbiddenException 结构化** | 用低权限账号调 admin 端点 | 错误响应含 `code: PERMISSION_DENIED` + `missingPermissions` |
| 10 | **regionPermissions 兼容** | 登录后看 user.regionPermissions | `{ CN: [...], US: [...], UAE: [...] }` 非空对象（兼容补丁生效） |

---

## 🔴 IAM 新能力（3~5 分钟）

| # | 检查 | 操作 | 预期 |
|---|---|---|---|
| 11 | **委托页面** | 访问 `/organization/delegations` | 页面正常；admin 看到"新建委托"按钮 |
| 12 | **Access Review 页面** | 访问 `/organization/access-review` | 页面正常；超期阈值下拉 60/90/120 |
| 13 | **Redis fail-secure** | `docker stop <redis-container>` → 浏览器访问业务页 | 401/403（fail secure），**不**是 500 也**不**是 200 |
| 14 | **DataScopeInterceptor 不影响读** | 任意带 @DataScope 的 controller 访问 | 现在没接入业务模块，所有读路径走旧逻辑，无回归 |

---

## 验证脚本（命令行）

```bash
# 数据库 IAM 审计日志
docker exec ffoa-wt-rbac-audit-postgres psql -U ffoa_dev -d ffws_wt_rbac_audit \
  -c "SELECT actor, action, resource, timestamp FROM platform_iam.iam_audit_log ORDER BY timestamp DESC LIMIT 10"

# IAM 治理新表是否存在
docker exec ffoa-wt-rbac-audit-postgres psql -U ffoa_dev -d ffws_wt_rbac_audit \
  -c "\dt platform_iam.*" | grep -E 'data_scopes|role_data_scope|permission_dele|field_perm|iam_audit'

# Redis 黑名单 / 缓存 key
docker exec ffoa-wt-rbac-audit-redis redis-cli -a ffws_dev_password --no-auth-warning \
  --scan --pattern 'token_blacklist:*' --count 5
docker exec ffoa-wt-rbac-audit-redis redis-cli -a ffws_dev_password --no-auth-warning \
  --scan --pattern 'user:*:auth' --count 5
```

---

## 出问题排查

| 现象 | 排查方向 |
|---|---|
| 登录 500 | 后端日志 → Prisma 是否能连 DB；schema 是否完整 |
| 登录 401 | DB 看 users 表是否有该账号且 status=ACTIVE |
| localStorage 没 refresh_token | F12 Network 看 /auth/login 响应里有没有 refreshToken；前端是否在 axios 改动前启动（重启 frontend） |
| 业务页 403 大面积 | 后端日志 `Missing required permissions` |
| Redis stop 后业务仍 200 | fail secure 没生效，检查 RedisService 故障路径 + JwtStrategy 异常处理 |

---

## Playwright MCP 自动化路径

由 AI 通过 MCP 驱动浏览器执行 1~6 必跑项 + 11/12 IAM 页面。
不能自动化的：
- 7（30min 续期，需要时间或临时改配置）
- 8（DB 查询，命令行）
- 9（需要构造低权限账号）
- 13（需要 docker stop）
- 14（需要业务模块接入 @DataScope，当前阶段无）

最佳工作流：AI 跑 MCP 必跑项 → 报告通过/失败 → 人工补 7/8/9/13/14。
