# M2 用户、角色与权限 — 逻辑设计文档（LDD · How）

| 项 | 值 |
|---|---|
| 模块 | M2 用户、角色与权限 |
| 类型 | 逻辑设计文档（LDD） |
| 对应需求 | [requirements/M2](../requirements/M2-用户角色与权限.md) |
| 上级 | [需求分析总纲](../需求分析总纲.md) |

> 本文档描述**实现方式（How）**：数据模型、RBAC/ABAC 机制、数据范围映射、SSO/供给集成；"做什么/为什么/验收"见对应需求文档。
> 本模块成熟度为"已起草待细化"，实现细节尚少，本文档仅收纳已明确的数据模型片段与集成机制，未确定处不臆造。

## 1. 数据模型
```
User *──* Role                                （多角色，权限取并集）
User ──▶ scope_attributes(region, own_customers[], joined_projects[], own_opportunities[])
Role ──▶ actions[]                            （RBAC，动作字典条目 模块:对象:操作，见 §3b）
Project ──▶ pm(User)                          （PM=项目级负责人指派，叠加项目数据范围；非全局角色）
User(Customer_External) ──▶ scoped to own projects/deliverables（受限只读 + 签署）
```
- User 唯一键 = email（Google + 飞书 SSO 按 email 合并）。
- Role 集合动态可配（不 hard-code），枚举对齐总纲 §1.4。
- **Permission = 动作字典条目（`模块:对象:操作`）**；**DataScopePolicy = 由用户属性计算的数据范围（§3）**，每请求实时解析（§4）。

## 2. 权限模型：RBAC + ABAC 双层
- **RBAC 管功能权限**：角色 → 可执行的功能动作（立项、审批、配置等）。
- **ABAC 管数据范围**：由用户属性（角色、所属 Region、所属客户、参与项目）计算可见数据集。
- **多角色并集**：一人多角色时，功能权限与数据范围均取**并集**（如 TAM 兼 CSM 时，两类可见客户合并）。

## 3. 数据范围映射（ABAC 解析规则）
| 角色 | 可见数据范围 |
|---|---|
| TAM / CSM | 自己绑定的客户 |
| PSE | 自己参与的项目 |
| **Leader（TAM_Leader / PS_Leader / CS_Director）** | 本 **Region** 下数据（"Manager 见本 Region"即此；Region 为用户属性） |
| **Sales** | 自己的商机/客户 |
| **SA / Presale** | 自己参与的客户 |
| **Ops / Admin** | 全局（平台治理/下游运营） |
| Customer_External | 仅自己相关的项目/交付物（受限只读 + 签署） |

> **PM（项目负责人）** 不是全局角色而是项目级指派：其数据范围 = 所负责项目（叠加在其本身角色如 PSE 之上）。多角色取并集（FR-IAM-07）。

## 3b. RBAC 动作字典与基线矩阵
- **动作命名约定**：`模块:对象:操作`，如 `M1:customer:view360`、`M6:project:create`、`M9:request:approve`、`M8:deliverable:sign`。
- **核心动作 × 角色基线矩阵**（跨模块高频；✓=允许，—=否；空=按数据范围/项目角色，具体随各模块 FSD 细化）：

| 动作 \ 角色 | TAM | CSM | PSE | PS_Leader | Leader | Sales | SA | Ops | Admin | 外部 |
|---|---|---|---|---|---|---|---|---|---|---|
| `M1:customer:view360` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| `M1:contract:createVirtual`(发起) | ✓ | — | ✓ | ✓ | — | — | — | — | ✓ | — |
| `M6:project:create`(立项) | — | — | — | ✓(triage) | — | — | — | — | ✓ | — |
| `M7:time:log` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| `M9:request:approve` | — | — | — | ✓ | ✓ | — | — | — | ✓ | — |
| `M8:deliverable:review`(内审) | — | — | — | ✓ | — | — | — | — | ✓ | — |
| `M8:deliverable:sign`(客户签署) | — | — | — | — | — | — | — | — | — | ✓ |
| `M2:role/config:manage`(配置) | — | — | — | — | — | — | — | — | ✓ | — |

> 完整矩阵按 `模块:对象:操作` 在各模块 FSD 权限章节声明、汇总到此；本表为**已冻结的基线框架**，非最终全集。

## 4. 关键机制
- **SSO 合并**：Google 与飞书两条 SSO 登录，按 email 归并为同一 User。
- **权限解析（即时生效）**：**JWT 仅承载身份**；每次请求由服务端中间件按用户当前角色/属性**实时解析 RBAC（动作）+ ABAC（数据范围）**（结果可缓存 + 主动失效），故权限变更即时生效、无需重登。
- **用户供给（Provisioning）**：与 HR/IdP 通过 SCIM 或等价机制同步；入职自动开通、离职/转岗自动回收权限。**外部账号例外**：非 SCIM 来源，由 TAM/项目负责人(PM)邀请创建，项目关闭/联系人离场后失效（回收规则见 FSD）。
- **PM / Manager 映射**：PM = 项目级负责人指派（叠加项目数据范围），Manager = Leader 角色 + Region 属性，均不新增全局角色。
- **审计**：越权访问拦截并记日志；权限/角色变更全量审计（NFR-04）。
