# 测试用例：M2 用户、角色与权限

| 项 | 值 |
|---|---|
| 对应 FSD | [M2-用户角色与权限-FSD](M2-用户角色与权限-FSD.md) |
| 对应 PRD | [requirements/M2](../requirements/M2-用户角色与权限.md) |

> 用例按 **正常 / 边界 / 异常** 分类；具体阈值/周期以业务确认值为准（标"待业务"处，如权限变更生效延迟目标值）。

## 一、覆盖范围
SSO 登录与身份合并、角色与功能权限（RBAC）、数据范围（ABAC）、多角色并集、权限变更即时生效与越权审计、用户供给（入离职/转岗）、外部账号（邀请/受限）。

## 二、测试用例

### 2.1 SSO 登录与身份合并

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-001 | Google SSO 登录 | 已开通 User | Google 登录 | 按 email 命中 User，建会话进工作台 | P0 |
| TC-N-002 | 同 email 跨 SSO 合并 | 已用 Google 登录过 | 改用飞书登录同 email | 合并到同一 User，不重复建号 | P0 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-001 | 首登且已有供给记录 | 供给已建 User | 首次 SSO 登录 | 命中并启用，直接可用 | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-001 | email 无匹配且非邀请/供给 | 未开通 | SSO 登录 | 提示"账号未开通"，阻断+记日志，不建号 | P0 |
| TC-E-002 | 账号已停用 | 离职停用 | SSO 登录 | 拒绝登录+记审计 | P0 |
| TC-E-003 | IdP 无 email 返回 | — | SSO 登录 | 阻断，不建号 | P1 |

### 2.2 角色与功能权限（RBAC）

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-011 | 有权限执行功能 | 角色含该动作 | 执行立项 | 放行 | P0 |
| TC-N-012 | 动态新增角色并赋权 | Admin | 新建角色+勾选权限+赋给用户 | 该用户获得对应功能权限 | P0 |
| TC-N-013 | RBAC 独立配置生效 | 仅改 RBAC、不动 ABAC | 调整功能权限 | 功能权限变化、数据范围不变（解耦） | P0 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-011 | 删除被引用角色 | 角色仍有用户引用 | 删除该角色 | 阻断，提示先解绑 | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-011 | 无功能权限执行动作 | 角色不含该动作 | 尝试执行 | 拒绝+记审计（FR-IAM-05） | P0 |
| TC-E-012 | 分配不存在的角色 | — | 赋无效角色 | 阻断 | P1 |
| TC-E-013 | 非 Admin 改角色权限 | 普通角色 | 打开角色管理 | 入口不可见/拒绝 | P0 |

### 2.3 数据范围（ABAC）

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-021 | TAM 见自己客户 | TAM 绑定客户 A | 查客户列表 | 仅见 A（自己绑定客户） | P0 |
| TC-N-022 | PS 见参与项目 | PS 参与项目 P | 查项目列表 | 仅见 P（自己参与项目） | P0 |
| TC-N-023 | Manager 见本 Region | Manager(Region=X) | 查数据 | 仅见 Region X 下数据 | P0 |
| TC-N-024 | ABAC 独立配置生效 | 仅改范围策略、不动 RBAC | 调整范围规则 | 数据范围变化、功能权限不变（解耦） | P0 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-021 | scope 属性为空 | TAM 无绑定客户 | 查客户列表 | 返回空集、空态，不报错 | P1 |
| TC-B-022 | 范围规则未配置 | 策略缺失 | 访问数据 | 默认拒绝（最小权限，NFR-03） | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-021 | 访问范围外数据 | TAM 未绑定客户 B | 直达客户 B | 拦截/不可见，记审计；越界可见记录数=0 | P0 |
| TC-E-022 | 非 Admin 改范围策略 | 普通角色 | 打开范围策略页 | 入口不可见/拒绝 | P0 |

### 2.4 多角色并集

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-031 | TAM 兼 CSM 数据并集 | 用户=TAM+CSM，各绑不同客户 | 查客户列表 | 见两角色客户之并（无遗漏） | P0 |
| TC-N-032 | 多角色功能并集 | 用户=角色1(立项)+角色2(审批) | 执行立项、审批 | 两动作均放行（并集） | P0 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-031 | 角色间重复权限 | 两角色含同一动作 | 执行该动作 | 去重合并、放行一次，效果等价 | P1 |
| TC-B-032 | 并集中某角色被移除 | 多角色用户 | 停用/删其中一角色 | 即时重算，仅移除该角色贡献 | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-031 | 并集越权校验 | 多角色 | 执行任一角色都无的动作 | 拒绝+审计（并集无越权） | P0 |

### 2.5 权限变更即时生效与越权审计

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-041 | 权限变更即时生效 | 用户在线 | Admin 撤其某权限 | 下一次动作即被拒，无需重登 | P0 |
| TC-N-042 | 越权访问全量记日志 | — | 触发一次越权 | 拦截且 100% 写审计（actor/action/target/result/at） | P0 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-041 | 审计写入失败 | 审计服务异常 | 触发越权 | 告警+重试；不放行未记账的越权动作 | P1 |
| TC-E-042 | 非 Admin 查审计 | 普通角色 | 打开审计日志页 | 不可见/拒绝 | P1 |

> 生效延迟目标值待业务确认（趋近即时）；越权拦截率=100% 且 100% 记日志。

### 2.6 用户供给（入离职 / 转岗）

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-051 | 入职自动开通 | HR 入职事件 | 触发同步 | 按 email 建/合并 User、赋初始角色、启用 | P0 |
| TC-N-052 | 离职自动回收 | HR 离职事件 | 触发同步 | 停用+回收全部角色/权限，即时生效+审计 | P0 |
| TC-N-053 | 转岗调整权限 | HR 转岗事件 | 触发同步 | 角色/范围调整，即时重算 | P1 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-051 | 供给 email 与既有 User 冲突 | 已有同 email User | 供给同步 | 按 email 归并，不重复建号 | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-051 | SCIM 同步失败 | HR 接口超时 | 触发同步 | 重试+告警；保留上次状态（NFR-06） | P0 |
| TC-E-052 | 离职后仍尝试登录 | 已停用 | SSO 登录 | 拒绝（与 TC-E-002 一致） | P0 |

### 2.7 外部账号（邀请 / 受限）

**正常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-N-061 | TAM 邀请外部账号 | TAM 负责项目 P | 邀请外部 email、scope=P | 生成邀请；首登建 Customer_External、绑定 P | P0 |
| TC-N-062 | 外部账号仅见自己项目 | 外部账号绑定 P | 查看数据 | 仅见 P 相关项目/交付物 | P0 |
| TC-N-063 | 外部账号签署 | 外部账号、有待签 | 执行签署 | 签署成功（复用 M8） | P1 |

**边界**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-B-061 | 邀请范围超发起人范围 | TAM 邀请到非自己项目 | 定 scope 超范围 | 阻断，"只能邀请到您负责的项目/交付物" | P1 |

**异常**

| 编号 | 场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|---|
| TC-E-061 | 非 TAM/PM 发起开通 | 如 PS/CSM | 尝试邀请 | 阻断+审计；阻断率=100% | P0 |
| TC-E-062 | 外部账号越权写 | 外部账号 | 尝试编辑/立项 | 拒绝+审计；非只读/签署写操作数=0 | P0 |
| TC-E-063 | 外部账号访问他人项目 | 外部账号 A（绑 P） | 直达项目 Q | 拦截/不可见+审计；越界=0 | P0 |

## 三、覆盖率目标
- 关键路径 100%（SSO 合并 / RBAC 与 ABAC 独立生效 / 多角色并集 / 供给入离职 / 外部账号邀请）。
- 异常路径 ≥ 90%（所有 TC-E-*）。
- 硬约束 100% 有对应 TC-E/TC-N 覆盖：SSO 合并正确率=100%、越界可见记录数=0、越权拦截率=100% 且 100% 记日志、外部账号非只读/签署写操作数=0、非 TAM/PM 开通阻断率=100%。
