# 权限接口矩阵与数据边界清单 > 适用范围:当前 `leaudit-platform` 已落地后端接口 > 文档定位:把“接口 -> permission -> data_scope -> 模块策略 -> 风险点”串成联调、改造、测试共用清单。 --- ## 1. 使用说明 本清单按“模块”组织,每个接口至少标注: - 接口路径 - 当前权限点 - 是否需要统一数据范围执行器 - scope 类型 - 是否存在模块特例策略 - 当前风险和改造备注 字段解释: - `是否需要 scope` - `是`:必须进入统一执行器 - `否`:仅做功能权限即可 - `scope 类型` - `ALL/DEPT/SELF` - `PUBLIC_MIXED` - `RELATION` - `NONE` - `模块策略` - 指是否需要 `ModulePolicy` --- ## 2. 认证与会话 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `/auth/login` | 无 | 否 | `NONE` | 否 | 登录接口,返回完整 `roles/permissions` | | `/auth/me` | 登录态 | 否 | `NONE` | 否 | 只返回当前用户信息,不涉及横向数据 | | JWT 鉴权链路 | 登录态 | 否 | `NONE` | 否 | JWT 只存最小身份,不存完整权限 | 结论: - 认证域不接数据范围执行器 - 但 `/auth/me` 建议后续补充“能力快照/有效 scope 摘要”,供前端去角色化 --- ## 3. 文档模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/documentController.py` ## 3.1 文档主接口 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `POST /upload` | 当前未显式走 permission | 是 | `DEPT/SELF` | `DocumentPolicy` | 上传时 `region` 不能越权指定;需补 permission 显式化 | | `GET /documents/list` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 当前在 service 内自行按 `is_global/can_manage/created_by` 控制 | | `GET /documents/status` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 批量状态接口容易成为绕过列表边界的侧门 | | `GET /documents/{DocumentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 详情必须和列表边界一致 | | `PUT /documents/{DocumentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 写操作应先做资源在 scope 内校验 | | `DELETE /documents/{DocumentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 删除边界必须与详情一致 | | `POST /documents/{DocumentId}/attachments` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 附件追加不能绕过文档属地 | | `POST /upload/upload_contract_template` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 实际依赖文档归属,容易与合同模板域耦合 | ## 3.2 评查结果相关 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/review-points/{DocumentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 必须回溯文档归属 | | `PATCH /v3/review-points/{ReviewPointResultId}/audit` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 审核动作要基于文档 scope,不应仅按结果 ID | | `PATCH /v3/documents/{DocumentId}/confirm` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `DocumentPolicy` | 文档确认权限与详情边界需一致 | 文档模块结论: - 当前后端主要依赖 service 内部范围判断,不够显式 - 应补齐 `documents:*:*`、`review_points:*:*` 一类 permission_key 与 scope 执行 - 文档详情、状态、附件、确认都必须视为“文档主资源的派生资源” --- ## 4. 公文模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/govdocController.py` ## 4.1 公文文档 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `POST /govdoc/documents` | 当前未显式走 permission | 是 | `DEPT/SELF` | `GovdocPolicy` | 上传时 `region` 需受用户 scope 约束 | | `GET /govdoc/documents` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 现有逻辑与文档模块相似,但未统一 | | `GET /govdoc/documents/{documentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 详情边界必须与列表一致 | | `PATCH /govdoc/documents/{documentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 更新动作必须做资源属地校验 | | `DELETE /govdoc/documents/{documentId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 删除不能只凭 ID 存在 | | `GET /govdoc/documents/{documentId}/original` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 原文下载是高风险侧门,必须回溯文档 scope | ## 4.2 审查运行与结果 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `POST /govdoc/runs` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 创建 run 必须先验证文档是否在 scope 内 | | `GET /govdoc/runs/{runId}` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 必须通过 run 反查 document | | `GET /govdoc/runs/{runId}/result` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/findings` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/entities` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/structure` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/outline` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/paragraphs` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 同上 | | `GET /govdoc/runs/{runId}/report/html` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 报告查看必须回溯文档 scope | | `GET /govdoc/runs/{runId}/report/docx` | 当前未显式走 permission | 是 | `ALL/DEPT/SELF` | `GovdocPolicy` | 报告下载是重点回归项 | ## 4.3 规则查看 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /govdoc/rules` | 当前未显式走 permission | 否 | `NONE` | 否 | 更偏规则元数据 | | `GET /govdoc/rules/{ruleId}` | 当前未显式走 permission | 否 | `NONE` | 否 | 不依赖 area | 公文模块结论: - 最关键不是列表,而是所有 `run/result/report/original` 派生接口必须继承文档边界 - 这部分非常容易出现“列表收住了,下载没收住”的问题 --- ## 5. 使用统计模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/usageStatsController.py` | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/usage-stats/overview` | `usage_stats:overview:read` | 是 | `ALL/DEPT/SELF` | `UsageStatsPolicy` | 当前 service 内已区分 areaScope=user/document | | `GET /v3/usage-stats/trends` | `usage_stats:trends:read` | 是 | `ALL/DEPT/SELF` | `UsageStatsPolicy` | 趋势与概览边界必须一致 | | `GET /v3/usage-stats/by-users` | `usage_stats:users:read` | 是 | `ALL/DEPT/SELF` | `UsageStatsPolicy` | `SELF` 时只能看本人 | | `GET /v3/usage-stats/by-departments` | `usage_stats:departments:read` | 是 | `ALL/DEPT` | `UsageStatsPolicy` | 普通用户是否允许进入,建议改为无权限或只看自身部门汇总 | | `GET /v3/usage-stats/by-areas` | `usage_stats:areas:read` | 是 | `ALL/DEPT` | `UsageStatsPolicy` | 地区汇总对 `SELF` 没有清晰业务意义,建议禁止 | | `GET /v3/usage-stats/details` | `usage_stats:details:read` | 是 | `ALL/DEPT/SELF` | `UsageStatsPolicy` | 明细接口是高风险越权点 | 统计模块结论: - 当前实现已经比较接近统一策略,但仍是模块内自实现 - `areaScope=document` 和 `areaScope=user` 必须在统一执行器中显式挂接字段映射 - `details` 是重点保护接口 --- ## 6. RAG 模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/ragChatController.py` ## 6.1 聊天应用 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/rag/apps` | `rag:app:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 当前按 `area in (user_area, 省级, '') or is_public` | | `GET /v3/rag/apps/default` | `rag:app:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 默认应用与列表边界必须一致 | | 聊天发送相关接口 | `rag:chat:use` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 发送前要校验目标 app/dataset 可见 | | 会话列表/详情 | `rag:conversation:read` | 是 | `SELF` | `RagPolicy` | 会话一般只看自己的 | | 会话重命名 | `rag:conversation:update` | 是 | `SELF` | `RagPolicy` | 仅自己会话 | | 会话删除 | `rag:conversation:delete` | 是 | `SELF` | `RagPolicy` | 仅自己会话 | | 消息反馈 | `rag:message:feedback` | 是 | `SELF` | `RagPolicy` | 仅自己消息链路 | ## 6.2 知识库读接口 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/rag/datasets/my` | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 现有命名是 my,但行为已不是纯 self | | `GET /v3/rag/datasets/{DatasetId}` | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 详情需继承地区+公开规则 | | `GET /v3/rag/datasets/{DatasetId}/documents` | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 文档列表需继承数据集可见性 | | `GET /v3/rag/datasets/{DatasetId}/documents/{DocumentId}` | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 单文档详情要回溯数据集 | | `GET /v3/rag/datasets/{DatasetId}/segments` 等派生接口 | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 所有派生资源必须回溯 dataset | | `POST /v3/rag/datasets/{DatasetId}/retrieve` | `rag:dataset:read` | 是 | `PUBLIC_MIXED` | `RagPolicy` | 检索测试属于读权限扩展 | ## 6.3 知识库管理接口 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/rag/datasets/admin` | `rag:dataset:manage` | 是 | `ALL/DEPT` | `RagPolicy` | 当前 controller 按 permission 放行,service 又按 `UserRole` 二次拒绝 | | `POST /v3/rag/datasets/admin` | `rag:dataset:create` | 是 | `ALL/DEPT` | `RagPolicy` | 创建时 area 指定受 scope 限制 | | `PUT /v3/rag/datasets/admin/{DatasetId}` | `rag:dataset:update` | 是 | `ALL/DEPT` | `RagPolicy` | 目标资源必须在 scope 内 | | `DELETE /v3/rag/datasets/admin/{DatasetId}` | `rag:dataset:delete` | 是 | `ALL/DEPT` | `RagPolicy` | 同上 | | `PATCH /v3/rag/datasets/{DatasetId}` | `rag:dataset:update` | 是 | `ALL/DEPT/SELF` | `RagPolicy` | 需统一 admin 版与通用版接口边界 | | `POST /v3/rag/datasets/{DatasetId}/documents` | `rag:dataset:update` | 是 | `ALL/DEPT/SELF` | `RagPolicy` | 文档上传需继承 dataset scope | | `POST /v3/rag/datasets/{DatasetId}/documents/{DocumentId}/update-by-file` | `rag:dataset:update` | 是 | `ALL/DEPT/SELF` | `RagPolicy` | 同上 | | `DELETE /v3/rag/datasets/{DatasetId}/documents/{DocumentId}` | `rag:dataset:update/delete` | 是 | `ALL/DEPT/SELF` | `RagPolicy` | 以数据集为主资源边界 | RAG 模块结论: - 是当前权限改造的第一优先级 - 最大问题不是 permission 缺失,而是“controller 按 permission、service 按角色”的双轨冲突 - 所有 `UserRole` 白名单都要迁到 `permission + scope + RagPolicy` --- ## 7. 交叉评查模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/crossReviewController.py` | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `POST /v3/cross-review/tasks` | `cross_review:task:create` | 是 | `RELATION` | `CrossReviewPolicy` | 创建任务后需自动建立成员关系 | | `POST /v3/cross-review/tasks/query` | `cross_review:task:read` | 是 | `RELATION` | `CrossReviewPolicy` | 不按 area,而按 `task_member` | | `GET /v3/cross-review/tasks/{TaskId}/progress` | `cross_review:progress:view` | 是 | `RELATION` | `CrossReviewPolicy` | 需验证当前用户是任务参与方 | | `GET /v3/cross-review/tasks/{TaskId}/documents` | `cross_review:task:read` + `cross_review:document:read` | 是 | `RELATION` | `CrossReviewPolicy` | 文档列表由任务关系派生 | | `GET /v3/cross-review/tasks/{TaskId}/can-confirm` | `cross_review:document:complete` | 是 | `RELATION` | `CrossReviewPolicy` | 不能只看 permission,要看用户在任务中的职责 | | `POST /v3/cross-review/tasks/{TaskId}/documents/{DocumentId}/complete` | `cross_review:document:complete` | 是 | `RELATION` | `CrossReviewPolicy` | 高风险写接口 | | `POST /v3/cross-review/tasks/{TaskId}/documents/upload` | `cross_review:document:complete` | 是 | `RELATION` | `CrossReviewPolicy` | 上传文档须确认任务成员关系 | | `POST /v3/cross-review/tasks/{TaskId}/documents/{DocumentId}/attachments` | `cross_review:document:complete` | 是 | `RELATION` | `CrossReviewPolicy` | 同上 | | `POST /v3/cross-review/proposals` | `cross_review:proposal:create` | 是 | `RELATION` | `CrossReviewPolicy` | 提案创建需验证目标文档在任务关系内 | | `POST /v3/cross-review/proposals/{ProposalId}/votes` | `cross_review:proposal:vote` | 是 | `RELATION` | `CrossReviewPolicy` | 投票边界不应只看提案 ID | | `DELETE /v3/cross-review/proposals/{ProposalId}` | `cross_review:proposal:delete` | 是 | `RELATION` | `CrossReviewPolicy` | 需限定提案创建者或具备特定任务身份 | | `GET /v3/cross-review/documents/{DocumentId}/proposals` | `cross_review:proposal:read` | 是 | `RELATION` | `CrossReviewPolicy` | 通过文档反查任务关系 | | `GET /v3/cross-review/documents/{DocumentId}/pending-votes` | `cross_review:proposal:read` + `cross_review:document:complete` | 是 | `RELATION` | `CrossReviewPolicy` | 组合权限接口 | | `GET /v3/cross-review/documents/{DocumentId}/proposals/export` | `cross_review:proposal:read` | 是 | `RELATION` | `CrossReviewPolicy` | 导出接口重点防越权 | 交叉评查模块结论: - 不能硬塞 `ALL/DEPT/SELF` - 但必须接入统一执行框架 - 最终统一的是“决策入口”,不是“所有模块都长得一样” --- ## 8. RBAC 管理域 控制器:`fastapi_modules/fastapi_leaudit/controllers/rbacAdminController.py`、`rbacController.py` ## 8.1 当前用户菜单 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /rbac/user/routes` | 登录态 + 数据库路由 | 否 | `NONE` | 否 | 主要是菜单授权,不直接做数据范围 | ## 8.2 角色、用户、授权管理 | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/rbac/roles` | `rbac:roles:read` | 否 | `NONE` | `RbacAdminPolicy` | 角色列表本身通常不按 area 分裂 | | `POST /v3/rbac/roles` | `rbac:roles:create` | 否 | `NONE` | `RbacAdminPolicy` | 但角色可配置的 data_scope 要受管控 | | `PUT /v3/rbac/roles/{RoleId}` | `rbac:roles:update` | 否 | `NONE` | `RbacAdminPolicy` | 系统角色修改需附加约束 | | `DELETE /v3/rbac/roles/{RoleId}` | `rbac:roles:delete` | 否 | `NONE` | `RbacAdminPolicy` | 同上 | | `GET /v3/rbac/users` | `rbac:users:read` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 当前 service 内按 `u.area` 收敛 | | `GET /admin/users/organizations/tree` | `rbac:users:read` / `rbac:org:read` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 组织树也要受 area 控制 | | `GET /v3/rbac/roles/{RoleId}/users` | `rbac:role_users:read` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 角色关联用户列表受 area 约束 | | `POST /v3/rbac/users/{UserId}/roles` | `rbac:user_roles:write` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 不能给越权地区用户分配角色 | | `DELETE /v3/rbac/users/{UserId}/roles/{RoleId}` | `rbac:user_roles:write` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 同上 | | `GET /v3/rbac/users/{UserId}/roles` | `rbac:user_roles:read` | 是 | `ALL/DEPT` | `RbacAdminPolicy` | 同上 | | `GET /v3/routes` | `rbac:routes:read` | 否 | `NONE` | `RbacAdminPolicy` | 路由元数据接口 | | `GET /rbac/roles/{RoleId}/routes` | `rbac:role_routes:read` | 否 | `NONE` | `RbacAdminPolicy` | 配置域接口 | | `PUT /rbac/roles/{RoleId}/routes` | `rbac:role_routes:write` | 否 | `NONE` | `RbacAdminPolicy` | 配置域接口 | | `GET /v3/rbac/role-permissions` | `rbac:role_permissions:read` | 否 | `NONE` | `RbacAdminPolicy` | 配置域接口 | | `POST /v3/rbac/role-permissions` | `rbac:role_permissions:write` | 否 | `NONE` | `RbacAdminPolicy` | 可直接影响 scope,需审计 | | `POST /v3/rbac/roles/{RoleId}/access` | `rbac:role_access:write` | 否 | `NONE` | `RbacAdminPolicy` | 原子保存授权接口 | | `GET /v3/routes/{RouteId}/permissions` | `rbac:route_permissions:read` | 否 | `NONE` | `RbacAdminPolicy` | 配置域接口 | RBAC 域结论: - 角色/路由/权限配置本身更多是功能权限 - 用户相关接口则需要显式纳入 area scope - 当前 `_assertManagePermission` 与 `_assertPermission` 双层耦合,需统一 --- ## 9. 合同模板模块 控制器:`fastapi_modules/fastapi_leaudit/controllers/contractTemplateController.py` | 接口 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | `GET /v3/contract-templates/categories` | `contract_template:list:read` / `contract_template:search:read` | 否 | `NONE` | 否 | 分类基本可视为元数据 | | `GET /v3/contract-templates` | `contract_template:list:read` | 是 | `ALL/DEPT/SELF` | `ContractTemplatePolicy` | 当前 service 内按 `is_global/can_manage/region/created_by` 控制 | | `POST /v3/contract-templates` | `contract_template:create:write` | 是 | `ALL/DEPT` | `ContractTemplatePolicy` | 当前前端还写死 `role === admin` 才能上传 | | `GET /v3/contract-templates/search` | `contract_template:search:read` | 是 | `ALL/DEPT/SELF` | `ContractTemplatePolicy` | 搜索与列表边界必须一致 | | `GET /v3/contract-templates/{TemplateId}` | `contract_template:detail:read` / `contract_template:list:read` | 是 | `ALL/DEPT/SELF` | `ContractTemplatePolicy` | 详情要回溯模板属地 | | `DELETE /v3/contract-templates/{TemplateId}` | `contract_template:delete:delete` | 是 | `ALL/DEPT/SELF` | `ContractTemplatePolicy` | 删除不能只靠按钮隐藏 | 合同模板模块结论: - 后端已有一定范围逻辑,但前端仍强依赖角色名 - 是典型“后端可改,前端也必须同步去硬编码”的模块 --- ## 10. 首页与入口模块 相关实现:`homeServiceImpl.py` | 接口/能力 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | 首页入口模块列表 | 登录态 / 配置域权限 | 是 | `ALL/DEPT` | `HomePolicy` | 当前有 `super_admin` 绕过 `areas` 配置逻辑 | | 入口模块地区配置 | 配置域权限 | 否 | `NONE` | `HomePolicy` | 主要是管理配置,不是数据读取 | 首页域结论: - 不是典型数据表 scope - 但入口是否可见,实质上仍是一种 area 边界 - 后续应复用统一能力快照,而不是继续写 `bypass_area` --- ## 11. 规则、规则配置、评查点分组 控制器:`ruleController.py`、`ruleConfigController.py`、`evaluationPointGroupController.py` | 接口类型 | 当前权限点 | 是否需要 scope | scope 类型 | 模块策略 | 备注 | | --- | --- | --- | --- | --- | --- | | 规则列表/版本/内容 | `rules:*:*` | 否 | `NONE` | 否 | 偏元数据和配置域 | | 规则校验/发布/回滚 | `rules:*:*` | 否 | `NONE` | 否 | 高权限但不依赖 area | | 规则绑定 | `rules:*:*` | 否 | `NONE` | 否 | 配置域 | | 评查点分组列表 | `evaluation_group:list:read` / `rules:list:read` | 否 | `NONE` | 否 | 当前主要走功能权限 | | 评查点分组增删改 | `evaluation_group:*:*` | 否 | `NONE` | 否 | 配置域 | 结论: - 这一组接口主要关注功能权限,不是本轮统一 scope 的重点 - 但要进入接口矩阵,防止后续误把它们也做成地区隔离 --- ## 12. 风险接口总表 以下接口属于本轮改造最需要重点回归的高风险接口: 1. 文档详情、文档删除、附件追加、评查确认 2. 公文原文下载、报告下载、run 结果查看 3. 使用统计明细接口 `details` 4. RAG 管理接口 `/datasets/admin*` 5. 交叉评查导出接口 `/documents/{DocumentId}/proposals/export` 6. RBAC 用户角色分配接口 7. 合同模板创建与删除接口 这些接口共同特征是: - 容易绕过列表边界 - 多数不是“菜单是否可见”能防住的 - 很多地方当前还依赖 service 内部硬编码角色 --- ## 13. 改造原则 接口矩阵层面建议统一采用以下原则: 1. 列表、详情、下载、导出、删除、更新属于同一资源链路,必须复用同一 scope 决策 2. 组合权限接口应先判功能权限,再判资源边界 3. 任何通过子资源 ID 访问父资源内容的接口,都必须回溯父资源做 scope 校验 4. 前端按钮可见性不能替代后端数据边界 5. RAG 和交叉评查虽然是特例模块,也必须进入统一执行框架 --- ## 14. 本清单的使用方式 研发使用: - 作为统一执行器接入清单 - 明确哪些接口先接、哪些接口只做功能权限 测试使用: - 作为接口级回归矩阵底稿 - 按模块逐项校验“列表/详情/下载/导出/删除”一致性 产品和实施使用: - 明确哪些功能受角色去硬编码影响 - 明确哪些模块需要前端同步联调