# 用户权限初始化 SQL 与权限点清单

这份文档对应：`docs/权限与地区隔离/用户权限初始化SQL.sql`

用途只有两个：

- 帮你快速初始化当前新系统最小可用的用户权限体系
- 帮后续自己看代码、配角色、排查越权时不再忘记“每个权限点到底是干什么的”

当前这版严格按你确认过的业务收口：

- 只做 `RBAC + 单地区隔离`
- 用户地区只认 `sso_users.area`
- 角色只认 `provincial_admin`、`admin`、`common`
- `super_admin` 仅作为可选系统维护角色
- 数据范围只认 `ALL / DEPT / SELF`

---

## 1. 本次交付文件

- SQL：`docs/权限与地区隔离/用户权限初始化SQL.sql`
- 说明：`docs/权限与地区隔离/用户权限与权限点清单.md`

---

## 2. SQL 初始化了什么

这份 SQL 会初始化 5 类内容：

1. `roles` 角色基础数据
2. `sys_routes` 菜单 / 页面路由基础数据
3. `permissions` 权限点基础数据
4. `role_route` 角色可见菜单授权
5. `role_permissions` 角色权限点授权

它的定位不是“把所有未来功能一次性配满”，而是：

- 先把当前 `leaudit-platform` 已经稳定的核心能力配起来
- 后续有新接口，再继续增量追加权限点

---

## 3. 当前正式角色

## 3.1 `provincial_admin`

- 省级管理员
- 默认数据范围：`ALL`
- 能看全省文档、任务、评查结果、规则配置、用户与角色配置

## 3.2 `admin`

- 地区管理员
- 默认数据范围：`DEPT`
- 实际含义是“同地区”，不是组织部门
- 只能处理 `region = 当前用户.area` 的业务数据

## 3.3 `common`

- 普通用户
- 默认数据范围：`SELF`
- 通常只能看自己上传 / 自己触发 / 自己归属的数据
- 对部分只读接口，可以单独放宽到 `DEPT`

## 3.4 `super_admin`

- 可选系统超级管理员
- 默认数据范围：`ALL`
- 只建议用来做系统维护、初始化、排障
- 不建议参与日常业务权限设计

---

## 4. 数据范围解释

## 4.1 `ALL`

- 不做地区过滤
- 可看全部数据

## 4.2 `DEPT`

- 在本项目里，正式定义为“同地区”
- 一般等价于：`业务表.region = sso_users.area`

## 4.3 `SELF`

- 只能看自己的数据
- 一般等价于：
  - `created_by = 当前用户.id`
  - 或 `uploaded_by = 当前用户.id`
  - 或 `owner_id = 当前用户.id`

## 4.4 生效优先级

后端建议统一这样算：

1. 先看当前接口是否命中某条 `role_permissions`
2. 若该条有 `data_scope`，优先用它
3. 若该条没有 `data_scope`，回退到 `roles.data_scope`
4. 多角色命中时，取可见范围最大的那个：`ALL > DEPT > SELF`

---

## 5. 当前菜单建议

SQL 里初始化了以下核心菜单：

- `/documents`
- `/documents/list`
- `/rules`
- `/audit`
- `/audit/runs`
- `/system`
- `/system/users`
- `/system/roles`

这套菜单不是说前端必须完全一模一样，而是作为当前后台权限建模的“标准路径集合”。

---

## 6. 当前权限点清单

下面是当前已经纳入初始化 SQL 的权限点。

## 6.1 认证类

### `auth.me`

- 接口：`GET /api/auth/me`
- 用途：获取当前登录用户信息
- 建议角色：全部登录用户都可访问

---

## 6.2 文档类

### `documents.upload`

- 接口：`POST /api/upload`
- 用途：上传文档，可选自动触发评查
- `provincial_admin`：`ALL`
- `admin`：`DEPT`
- `common`：`SELF`

### `documents.list`

- 接口：`GET /api/documents/list`
- 用途：查看文档列表
- `provincial_admin`：全量文档
- `admin`：本地区文档
- `common`：自己的文档

### `documents.detail`

- 接口：`GET /api/documents/{documentId}`
- 用途：查看文档详情
- 数据范围逻辑应和 `documents.list` 保持一致

### `documents.history`

- 接口：`GET /api/documents/{documentId}/versions`
- 用途：查看同名文档历史版本
- 数据范围逻辑应和文档主记录一致

### `documents.delete`

- 接口：`DELETE /api/documents/{documentId}`
- 用途：删除文档
- 建议只开放给 `provincial_admin` 和 `admin`

---

## 6.3 评查类

### `audit.run`

- 接口：`POST /api/audit/run`
- 用途：手动触发评查
- `provincial_admin`：可发起任意地区 run
- `admin`：只能发起本地区 run
- `common`：只能发起自己可见文档的 run

### `audit.run.status`

- 接口：`GET /api/audit/run/{runId}`
- 用途：查看 run 当前执行状态

### `audit.result`

- 接口：`GET /api/audit/result/{runId}`
- 用途：查看评查结果

这两个接口都要跟随文档 / run 的归属范围过滤，不能因为知道 `runId` 就越权读取。

---

## 6.4 规则类

### `rules.list`

- 接口：`GET /api/rule-sets`
- 用途：查看规则集列表

### `rules.version.list`

- 接口：`GET /api/rule-sets/{ruleType}/versions`
- 用途：查看某规则集的版本列表

### `rules.content`

- 接口：`GET /api/rule-sets/versions/{versionId}/content`
- 用途：查看规则 YAML 正文

### `rules.validate`

- 接口：`POST /api/rule-sets/{ruleType}/validate`
- 用途：校验规则 YAML

### `rules.version.create`

- 接口：`POST /api/rule-sets/{ruleType}/versions`
- 用途：创建规则版本
- 建议开放给 `provincial_admin`
- 如确有地区自管需求，再按地区规则放给 `admin`

### `rules.publish`

- 接口：`POST /api/rule-sets/{ruleType}/publish`
- 用途：发布规则版本
- 建议只开放给 `provincial_admin`

### `rules.rollback`

- 接口：`POST /api/rule-sets/{ruleType}/rollback`
- 用途：规则回滚
- 建议只开放给 `provincial_admin`

### `rules.binding.list`

- 接口：`GET /api/rule-sets/bindings`
- 用途：查看规则绑定

### `rules.binding.create`

- 接口：`POST /api/rule-sets/{ruleType}/bindings`
- 用途：创建规则绑定

### `rules.binding.update`

- 接口：`PUT /api/rule-sets/bindings/{bindingId}`
- 用途：更新规则绑定

### `rules.binding.delete`

- 接口：`DELETE /api/rule-sets/bindings/{bindingId}`
- 用途：删除规则绑定

---

## 6.5 用户类

### `users.list`

- 接口：`GET /api/users/list`
- 用途：查看用户列表
- `provincial_admin`：全部用户
- `admin`：本地区用户
- `common`：通常不开放

### `users.create`

- 接口：`POST /api/users`
- 用途：创建用户
- 建议只开放给 `provincial_admin`

### `users.update`

- 接口：`PUT /api/users/{userId}`
- 用途：修改用户信息
- `admin` 仅能维护本地区用户

### `users.disable`

- 接口：`PUT /api/users/{userId}/disable`
- 用途：禁用 / 启用用户
- 建议只开放给 `provincial_admin`

### `users.roles.assign`

- 接口：`POST /api/users/{userId}/roles`
- 用途：为用户分配角色
- 建议只开放给 `provincial_admin`

---

## 6.6 RBAC 管理类

### `rbac.roles.list`

- 接口：`GET /api/rbac/roles`
- 用途：查看角色列表

### `rbac.roles.update`

- 接口：`PUT /api/rbac/roles/{roleId}`
- 用途：修改角色定义

### `rbac.permissions.list`

- 接口：`GET /api/rbac/permissions`
- 用途：查看权限点列表

### `rbac.role_permissions.assign`

- 接口：`POST /api/rbac/roles/{roleId}/permissions`
- 用途：给角色分配权限点

### `rbac.role_routes.assign`

- 接口：`PUT /api/rbac/roles/{roleId}/routes`
- 用途：给角色分配菜单

这些建议默认只给：

- `provincial_admin`
- `super_admin`

---

## 7. 角色默认授权概览

## 7.1 `provincial_admin`

建议拥有：

- 全部当前权限点
- 数据范围全部 `ALL`

## 7.2 `admin`

建议拥有：

- 文档上传、列表、详情、删除
- 评查触发、进度查看、结果查看
- 规则查看、校验、部分绑定维护
- 本地区用户列表与部分用户维护
- 数据范围多数为 `DEPT`

## 7.3 `common`

建议拥有：

- 当前用户信息
- 文档上传
- 自己文档列表 / 详情 / 历史版本
- 自己触发的评查任务与结果
- 部分规则只读查看
- 数据范围多数为 `SELF`

---

## 8. 后端接入要求

权限初始化 SQL 只是把“数据字典”配起来，真正生效还要靠后端统一遵守下面规则：

### 8.1 JWT 必须能拿到这些信息

至少要能拿到：

- `user_id`
- `area`
- `roles`
- `permissions`

### 8.2 接口先做功能权限，再做数据过滤

不要只做页面隐藏，必须后端实际校验：

1. 有没有权限点
2. 命中哪条 `data_scope`
3. 按 `ALL / DEPT / SELF` 注入查询条件

### 8.3 前端传入的地区不能覆盖后端数据权限

例如：

- `GET /api/documents/list?region=省局`

如果当前用户只是潮州 `admin`，后端仍然只能返回潮州数据，不能因为前端传了别的地区就放开。

---

## 9. 建议你怎么用这份 SQL

建议按这个顺序：

1. 先在测试库执行 `docs/权限与地区隔离/用户权限初始化SQL.sql`
2. 检查 `roles / permissions / role_permissions / role_route` 是否初始化成功
3. 给几个测试账号分别挂 `provincial_admin / admin / common`
4. 再用接口实际验证：
   - 文档列表是否按地区隔离
   - 当前用户信息是否正确返回 `area`
   - 上传 / 评查是否存在越权

---

## 10. 当前文档与总设计文档的关系

如果你后面忘了这套体系总原则，看这里：

- 总设计：`docs/权限与地区隔离/用户与地区权限完整设计方案.md`
- 导航说明：`docs/权限与地区隔离/权限与地区隔离文档导航.md`
- 本文：`docs/权限与地区隔离/用户权限与权限点清单.md`
- SQL：`docs/权限与地区隔离/用户权限初始化SQL.sql`

这四份组合起来，就是当前新系统用户权限方案的完整本地留档。
