# RBAC 权限管理 API 接口文档 v3.4 **最后更新**: 2025-01-29 **API 版本**: v3 **Base URL**: `/api/v3/rbac` --- ## 📋 目录 - [1. 概述](#1-概述) - [2. 认证说明](#2-认证说明) - [3. 角色管理 API (5个)](#3-角色管理-api) - [4. 权限管理 API (5个)](#4-权限管理-api) - [5. 角色权限关联 API (4个)](#5-角色权限关联-api) - [6. 用户角色管理 API (4个)](#6-用户角色管理-api) - [7. 数据模型 Schema](#7-数据模型-schema) - [8. 错误码说明](#8-错误码说明) - [9. 最佳实践](#9-最佳实践) --- ## 1. 概述 RBAC(基于角色的访问控制)系统提供完整的角色和权限管理功能。 ### 1.1 核心概念 - **角色(Role)**: 用户权限的集合,如 `provincial_admin`、`admin`、`user` - **权限(Permission)**: 具体的操作权限,如 `system:rbac:manage` - **角色权限关联**: 角色拥有哪些权限 - **用户角色关联**: 用户拥有哪些角色 ### 1.2 权限检查机制 所有 RBAC 管理接口(除查询外)都需要 `system:rbac:manage` 权限。 **权限验证流程**: 1. **实时数据库查询** - 每次请求都从数据库实时查询用户权限,**不使用缓存** 2. **JWT Token验证** - 验证Token有效性和用户身份 3. **权限匹配** - 检查用户是否拥有所需权限(支持通配符匹配) 4. **DENY优先** - DENY权限优先级高于GRANT权限 **权限即时生效** ⭐: - ✅ 授予权限后**立即生效**(无需等待) - ✅ 取消权限后**立即失效**(用户立即失去相应操作权限) - ❌ **不存在**权限缓存导致的延迟问题 **重要说明**: 如果取消用户的RBAC管理权限后,该用户的下一次操作请求会立即被拒绝(返回403错误)。如果出现"取消权限后仍能操作"的现象,可能的原因: 1. 前端未刷新页面(前端可能缓存了权限状态) 2. 使用了旧的API响应(浏览器缓存) 3. 多个浏览器Tab页面未同步 **建议**: - 修改权限后,建议用户刷新页面或重新登录 - 前端应在每次关键操作前检查权限(调用API时后端会验证) ### 1.3 地区数据隔离(v3.3+) | 角色类型 | 数据范围 | 说明 | |---------|---------|------| | **省级管理员** (`provincial_admin`) | 全部地区 | 可查看和管理所有地区数据 | | **市级管理员** (`admin`) | 本地区 | 只能查看和管理本地区(area)数据 | | **普通用户** | 本地区 | 只能查看本地区数据 | **地区过滤规则**: - 后端根据用户的 `area` 和 `user_role` 字段自动过滤数据 - 市级管理员尝试访问其他地区数据时返回 403 错误 ### 1.4 权限升级限制(v3.4+)⭐ 为保证权限安全,系统实施严格的角色升级控制: | 当前角色 | 可分配角色范围 | 不可分配角色 | 说明 | |---------|--------------|-------------|------| | **省级管理员** | 全部角色 | 无限制 | 拥有最高权限 | | **市级管理员** | 普通用户角色 | `admin`, `provincial_admin` | 不能提升用户为管理员 | | **普通用户** | 无 | 全部 | 无角色管理权限 | **安全规则**: 1. ✅ 省级管理员可以分配任何角色(包括其他省级管理员、市级管理员) 2. ❌ 市级管理员**不能**将普通用户提升为市级管理员或省级管理员 3. ❌ 市级管理员只能管理**本地区**普通用户的角色 4. ❌ 任何用户**不能**给自己分配角色(防止自我提权) 5. ❌ 取消用户的RBAC管理权限后,该用户**立即失去**所有RBAC操作权限 **典型场景**: ``` 场景1:市级管理员为本地区用户分配普通角色 ✅ - 当前用户:admin (梅州) - 目标用户:普通用户 (梅州) - 分配角色:auditor(审计员) - 结果:成功 场景2:市级管理员尝试提升用户为管理员 ❌ - 当前用户:admin (梅州) - 目标用户:普通用户 (梅州) - 分配角色:admin(市管理员) - 结果:失败 - "只有省级管理员可以分配市管理员角色" 场景3:市级管理员尝试操作其他地区用户 ❌ - 当前用户:admin (梅州) - 目标用户:普通用户 (云浮) - 分配角色:auditor(审计员) - 结果:失败 - "无权限给其他地区用户分配角色" ``` --- ## 2. 认证说明 ### 2.1 请求头 所有接口都需要携带 JWT Token: ```http Authorization: Bearer YOUR_JWT_TOKEN ``` ### 2.2 Token 获取 通过登录接口获取:`POST /api/v1/auth/login` --- ## 3. 角色管理 API ### 3.1 获取角色列表 **接口**: `GET /api/v3/rbac/roles` **权限要求**: 仅需登录 **Query 参数**: | 参数 | 类型 | 必填 | 说明 | 默认值 | |------|------|------|------|--------| | page | integer | 否 | 页码 | 1 | | page_size | integer | 否 | 每页数量 | 20 | | role_key | string | 否 | 角色标识过滤(模糊搜索) | - | | role_name | string | 否 | 角色名称过滤(模糊搜索) | - | **请求示例**: ```bash GET /api/v3/rbac/roles?page=1&page_size=20&role_name=管理员 ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "total": 5, "page": 1, "page_size": 20, "items": [ { "id": 1, "role_key": "provincial_admin", "role_name": "省级管理员", "description": "拥有系统所有权限", "data_scope": "ALL", "is_system": true, "user_count": 3, "permission_count": 25, "created_at": "2025-01-15T10:00:00", "updated_at": "2025-01-15T10:00:00" }, { "id": 2, "role_key": "admin", "role_name": "市级管理员", "description": "市级管理权限", "data_scope": "DEPT", "is_system": true, "user_count": 8, "permission_count": 15, "created_at": "2025-01-15T10:00:00", "updated_at": "2025-01-15T10:00:00" } ] } } ``` --- ### 3.2 获取角色详情 **接口**: `GET /api/v3/rbac/roles/{role_id}` **权限要求**: 仅需登录 **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | role_id | integer | 角色ID | **请求示例**: ```bash GET /api/v3/rbac/roles/1 ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "id": 1, "role_key": "provincial_admin", "role_name": "省级管理员", "description": "拥有系统所有权限", "data_scope": "ALL", "is_system": true, "permissions": [ { "id": 1, "permission_id": 10, "permission_key": "system:rbac:manage", "display_name": "RBAC管理权限", "grant_type": "GRANT", "data_scope": "ALL" } ], "metadata": {}, "created_at": "2025-01-15T10:00:00", "updated_at": "2025-01-15T10:00:00" } } ``` --- ### 3.3 创建角色 **接口**: `POST /api/v3/rbac/roles` **权限要求**: `system:rbac:manage` **Request Body**: ```json { "role_key": "custom_admin", "role_name": "自定义管理员", "description": "自定义的管理员角色", "data_scope": "DEPT", "metadata": { "custom_field": "value" } } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | 限制 | |------|------|------|------|------| | role_key | string | 是 | 角色标识(唯一) | 只能包含小写字母、数字、下划线,必须以字母开头 | | role_name | string | 是 | 角色名称 | 最大200字符 | | description | string | 否 | 角色描述 | - | | data_scope | string | 否 | 数据范围 | ALL/DEPT/SELF,默认SELF | | metadata | object | 否 | 元数据 | JSON对象 | **响应示例**: ```json { "code": 200, "message": "角色创建成功", "data": { "id": 10, "role_key": "custom_admin", "role_name": "自定义管理员", "description": "自定义的管理员角色", "data_scope": "DEPT", "is_system": false, "created_at": "2025-01-29T14:30:00", "updated_at": "2025-01-29T14:30:00" } } ``` --- ### 3.4 更新角色 **接口**: `PUT /api/v3/rbac/roles/{role_id}` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | role_id | integer | 角色ID | **Request Body** (所有字段可选): ```json { "role_name": "更新后的角色名", "description": "更新后的描述", "data_scope": "ALL", "metadata": { "updated": true } } ``` **响应示例**: ```json { "code": 200, "message": "角色更新成功", "data": { "id": 10, "role_key": "custom_admin", "role_name": "更新后的角色名", "description": "更新后的描述", "data_scope": "ALL", "is_system": false, "updated_at": "2025-01-29T14:35:00" } } ``` **注意事项**: - 系统角色(is_system=true)不可修改 - role_key 不可修改(唯一标识) --- ### 3.5 删除角色 **接口**: `DELETE /api/v3/rbac/roles/{role_id}` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | role_id | integer | 角色ID | **请求示例**: ```bash DELETE /api/v3/rbac/roles/10 ``` **响应示例**: ```json { "code": 200, "message": "角色删除成功", "data": { "role_id": 10, "deleted": true } } ``` **注意事项**: - 系统角色(is_system=true)不可删除 - 删除角色会自动删除相关的角色权限关联和用户角色关联 --- ## 4. 权限管理 API ### 4.1 获取权限列表(树形) **接口**: `GET /api/v3/rbac/permissions` **权限要求**: 仅需登录 **Query 参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | module | string | 否 | 按模块过滤 | | resource | string | 否 | 按资源过滤 | | permission_type | string | 否 | 按类型过滤(API/MENU/BUTTON) | **请求示例**: ```bash GET /api/v3/rbac/permissions?module=system ``` **响应示例** (树形结构): ```json { "code": 200, "message": "success", "data": [ { "id": 1, "permission_key": "system:*:*", "display_name": "系统全部权限", "description": "系统所有权限", "module": "system", "resource": "*", "action": "*", "permission_type": "API", "is_system": true, "parent_id": null, "sort_order": 0, "children": [ { "id": 2, "permission_key": "system:rbac:manage", "display_name": "RBAC管理", "description": "角色权限管理", "module": "system", "resource": "rbac", "action": "manage", "permission_type": "API", "is_system": true, "parent_id": 1, "sort_order": 1, "children": [] } ] } ] } ``` --- ### 4.2 获取权限详情 **接口**: `GET /api/v3/rbac/permissions/{permission_id}` **权限要求**: 仅需登录 **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | permission_id | integer | 权限ID | **请求示例**: ```bash GET /api/v3/rbac/permissions/2 ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "id": 2, "permission_key": "system:rbac:manage", "display_name": "RBAC管理", "description": "角色权限管理", "module": "system", "resource": "rbac", "action": "manage", "permission_type": "API", "is_system": true, "parent_id": 1, "sort_order": 1, "metadata": {}, "created_at": "2025-01-15T10:00:00", "updated_at": "2025-01-15T10:00:00" } } ``` --- ### 4.3 创建权限 **接口**: `POST /api/v3/rbac/permissions` **权限要求**: `system:rbac:manage` **Request Body**: ```json { "permission_key": "document:contract:view", "display_name": "查看合同", "description": "查看合同文档权限", "module": "document", "resource": "contract", "action": "view", "permission_type": "API", "parent_id": null, "sort_order": 10, "metadata": {} } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | 格式/限制 | |------|------|------|------|-----------| | permission_key | string | 是 | 权限键 | 格式: `module:resource:action` | | display_name | string | 是 | 显示名称 | 最大200字符 | | description | string | 否 | 权限描述 | - | | module | string | 是 | 模块 | 最大50字符 | | resource | string | 是 | 资源 | 最大50字符 | | action | string | 是 | 操作 | 最大50字符 | | permission_type | string | 否 | 权限类型 | API/MENU/BUTTON,默认API | | parent_id | integer | 否 | 父级权限ID | - | | sort_order | integer | 否 | 排序 | 默认0 | | metadata | object | 否 | 元数据 | JSON对象 | **响应示例**: ```json { "code": 200, "message": "权限创建成功", "data": { "id": 50, "permission_key": "document:contract:view", "display_name": "查看合同", "created_at": "2025-01-29T14:40:00" } } ``` --- ### 4.4 更新权限 **接口**: `PUT /api/v3/rbac/permissions/{permission_id}` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | permission_id | integer | 权限ID | **Request Body** (所有字段可选): ```json { "display_name": "查看所有合同", "description": "更新后的描述", "permission_type": "API", "parent_id": 1, "sort_order": 20, "metadata": { "updated": true } } ``` **响应示例**: ```json { "code": 200, "message": "权限更新成功", "data": { "id": 50, "permission_key": "document:contract:view", "display_name": "查看所有合同", "updated_at": "2025-01-29T14:45:00" } } ``` **注意事项**: - 系统权限(is_system=true)不可修改 - permission_key、module、resource、action 不可修改 --- ### 4.5 删除权限 **接口**: `DELETE /api/v3/rbac/permissions/{permission_id}` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | permission_id | integer | 权限ID | **请求示例**: ```bash DELETE /api/v3/rbac/permissions/50 ``` **响应示例**: ```json { "code": 200, "message": "权限删除成功", "data": { "permission_id": 50, "deleted": true } } ``` **注意事项**: - 系统权限(is_system=true)不可删除 - 删除权限会级联删除所有子权限和相关的角色权限关联 --- ## 5. 角色权限关联 API ### 5.1 获取角色的所有权限 **接口**: `GET /api/v3/rbac/role-permissions` **权限要求**: `system:rbac:manage` **Query 参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | role_id | integer | 是 | 角色ID | **请求示例**: ```bash GET /api/v3/rbac/role-permissions?role_id=1 ``` **响应示例**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "permission_id": 10, "permission_key": "system:rbac:manage", "display_name": "RBAC管理", "grant_type": "GRANT", "data_scope": "ALL" }, { "id": 2, "permission_id": 11, "permission_key": "document:*:view", "display_name": "查看文档", "grant_type": "GRANT", "data_scope": "DEPT" } ] } ``` --- ### 5.2 批量分配角色权限 **接口**: `POST /api/v3/rbac/role-permissions` **权限要求**: `system:rbac:manage` **Request Body**: ```json { "role_id": 5, "permissions": [ { "permission_id": 10, "grant_type": "GRANT", "data_scope": "ALL" }, { "permission_id": 11, "grant_type": "GRANT", "data_scope": "DEPT" }, { "permission_id": 12, "grant_type": "DENY", "data_scope": null } ], "replace": true } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | role_id | integer | 是 | 角色ID | | permissions | array | 是 | 权限列表 | | permissions[].permission_id | integer | 是 | 权限ID | | permissions[].grant_type | string | 否 | 授权类型(GRANT/DENY),默认GRANT | | permissions[].data_scope | string | 否 | 数据范围(ALL/DEPT/SELF) | | replace | boolean | 否 | 是否替换全部权限(true=替换,false=追加),默认false | **响应示例**: ```json { "code": 200, "message": "成功替换权限", "data": { "role_id": 5, "assigned_count": 3, "deleted_count": 5, "mode": "replace" } } ``` **注意事项**: - `replace=true`: 删除现有所有权限,插入新权限 - `replace=false`: 保留现有权限,追加新权限(跳过重复) - `provincial_admin` 角色的核心权限不可移除(即使 replace=true) --- ### 5.3 更新单个角色权限 **接口**: `PUT /api/v3/rbac/role-permissions` **权限要求**: `system:rbac:manage` **Query 参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | role_id | integer | 是 | 角色ID | | permission_id | integer | 是 | 权限ID | **Request Body**: ```json { "grant_type": "DENY", "data_scope": "SELF" } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | grant_type | string | 否 | 授权类型(GRANT/DENY) | | data_scope | string | 否 | 数据范围(ALL/DEPT/SELF) | **请求示例**: ```bash PUT /api/v3/rbac/role-permissions?role_id=5&permission_id=10 Content-Type: application/json { "grant_type": "DENY", "data_scope": "SELF" } ``` **响应示例**: ```json { "code": 200, "message": "权限更新成功", "data": { "id": 15, "role_id": 5, "permission_id": 10, "grant_type": "DENY", "data_scope": "SELF", "updated_at": "2025-01-29T15:00:00" } } ``` --- ### 5.4 移除角色权限 **接口**: `DELETE /api/v3/rbac/role-permissions` **权限要求**: `system:rbac:manage` **Query 参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | role_id | integer | 是 | 角色ID | | permission_id | integer | 是 | 权限ID | **请求示例**: ```bash DELETE /api/v3/rbac/role-permissions?role_id=5&permission_id=10 ``` **响应示例**: ```json { "code": 200, "message": "权限移除成功", "data": { "role_id": 5, "permission_id": 10 } } ``` **注意事项**: - `provincial_admin` 角色的核心权限不可移除(system:rbac:manage、system:*:*) --- ## 6. 用户角色管理 API ### 6.1 获取角色的所有用户 **接口**: `GET /api/v3/rbac/roles/{role_id}/users` **权限要求**: 仅需登录(地区数据隔离) **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | role_id | integer | 角色ID | **Query 参数**: | 参数 | 类型 | 必填 | 说明 | 默认值 | |------|------|------|------|--------| | page | integer | 否 | 页码 | 1 | | page_size | integer | 否 | 每页数量 | 20 | | area | string | 否 | 按地区过滤 | - | | username | string | 否 | 用户名模糊搜索 | - | **请求示例**: ```bash GET /api/v3/rbac/roles/1/users?page=1&page_size=20&area=梅州 ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "total": 8, "page": 1, "page_size": 20, "items": [ { "user_id": 10, "username": "zhangsan", "nick_name": "张三", "area": "梅州", "ou_name": "技术部", "phone_number": "13800138000", "email": "zhangsan@example.com", "assigned_at": "2025-01-20T10:00:00" } ] } } ``` **地区过滤规则**: - 省级管理员:可查看所有地区用户 - 市级管理员:只能查看本地区用户 - 普通用户:只能查看本地区用户 --- ### 6.2 获取用户的所有角色 **接口**: `GET /api/v3/rbac/users/{user_id}/roles` **权限要求**: 仅需登录(地区数据隔离) **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | user_id | integer | 用户ID | **请求示例**: ```bash GET /api/v3/rbac/users/10/roles ``` **响应示例**: ```json { "code": 200, "message": "success", "data": { "user_id": 10, "username": "zhangsan", "roles": [ { "role_id": 2, "role_key": "admin", "role_name": "市级管理员", "data_scope": "DEPT", "assigned_at": "2025-01-20T10:00:00" }, { "role_id": 5, "role_key": "auditor", "role_name": "审计员", "data_scope": "SELF", "assigned_at": "2025-01-22T11:00:00" } ] } } ``` --- ### 6.3 为用户分配角色 **接口**: `POST /api/v3/rbac/users/{user_id}/roles` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | user_id | integer | 用户ID | **Request Body**: ```json { "role_ids": [2, 5, 8] } ``` **字段说明**: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | role_ids | array | 是 | 角色ID列表(至少1个) | **请求示例**: ```bash POST /api/v3/rbac/users/10/roles Content-Type: application/json { "role_ids": [2, 5] } ``` **响应示例**: ```json { "code": 200, "message": "角色分配成功", "data": { "user_id": 10, "assigned_count": 2, "skipped_count": 0, "roles": [ { "role_id": 2, "role_key": "admin", "role_name": "市级管理员" }, { "role_id": 5, "role_key": "auditor", "role_name": "审计员" } ] } } ``` **注意事项**: - 会跳过用户已有的角色(不会重复分配) - 所有 role_id 必须存在且有效 **权限升级限制** ⭐ v3.4: 1. **省级管理员** - 可以分配任何角色(包括其他省级/市级管理员) 2. **市级管理员** - 只能分配普通用户角色,**不能**分配 `admin` 或 `provincial_admin` 角色 3. **地区限制** - 市级管理员只能给**本地区**用户分配角色 4. **防止自我提权** - 任何用户不能给自己分配角色 **错误示例**: ```json // 市级管理员尝试分配admin角色 { "code": 403, "message": "只有省级管理员可以分配市管理员角色,市管理员只能管理普通用户角色" } // 市级管理员尝试操作其他地区用户 { "code": 403, "message": "无权限给其他地区用户分配角色: target_area=云浮, your_area=梅州" } // 给自己分配角色 { "code": 403, "message": "禁止给自己分配角色" } ``` --- ### 6.4 移除用户角色 **接口**: `DELETE /api/v3/rbac/users/{user_id}/roles/{role_id}` **权限要求**: `system:rbac:manage` **Path 参数**: | 参数 | 类型 | 说明 | |------|------|------| | user_id | integer | 用户ID | | role_id | integer | 角色ID | **请求示例**: ```bash DELETE /api/v3/rbac/users/10/roles/5 ``` **响应示例**: ```json { "code": 200, "message": "角色移除成功", "data": { "user_id": 10, "role_id": 5, "removed": true } } ``` **注意事项**: - 如果用户没有该角色,会返回 404 错误 --- ## 7. 数据模型 Schema ### 7.1 角色相关 Schema #### RoleListItem(角色列表项) ```typescript interface RoleListItem { id: number; // 角色ID role_key: string; // 角色标识(唯一) role_name: string; // 角色名称 description: string | null; // 角色描述 data_scope: string; // 数据范围(ALL/DEPT/SELF) is_system: boolean; // 是否系统角色 user_count: number; // 拥有该角色的用户数 permission_count: number; // 该角色的权限数 created_at: string; // 创建时间(ISO 8601) updated_at: string; // 更新时间(ISO 8601) } ``` #### RoleDetail(角色详情) ```typescript interface RoleDetail { id: number; role_key: string; role_name: string; description: string | null; data_scope: string; is_system: boolean; permissions: RolePermissionItem[]; // 角色拥有的权限列表 metadata: Record; // 元数据 created_at: string; updated_at: string; } ``` --- ### 7.2 权限相关 Schema #### PermissionListItem(权限列表项,树形) ```typescript interface PermissionListItem { id: number; // 权限ID permission_key: string; // 权限键(module:resource:action) display_name: string; // 显示名称 description: string | null; // 权限描述 module: string; // 模块 resource: string; // 资源 action: string; // 操作 permission_type: string; // 权限类型(API/MENU/BUTTON) is_system: boolean; // 是否系统权限 parent_id: number | null; // 父级权限ID sort_order: number; // 排序 children: PermissionListItem[]; // 子权限(树形) } ``` --- ### 7.3 角色权限关联 Schema #### RolePermissionItem(角色权限项) ```typescript interface RolePermissionItem { id: number; // 关联ID permission_id: number; // 权限ID permission_key: string; // 权限键 display_name: string; // 显示名称 grant_type: string; // 授权类型(GRANT/DENY) data_scope: string | null; // 数据范围(ALL/DEPT/SELF) } ``` --- ### 7.4 用户角色关联 Schema #### RoleUserItem(角色用户项) ```typescript interface RoleUserItem { user_id: number; // 用户ID username: string; // 用户名 nick_name: string; // 昵称 area: string | null; // 地区 ou_name: string | null; // 组织单位名称 phone_number: string | null; // 手机号 email: string | null; // 邮箱 assigned_at: string; // 分配时间(ISO 8601) } ``` #### UserRoleItem(用户角色项) ```typescript interface UserRoleItem { role_id: number; // 角色ID role_key: string; // 角色标识 role_name: string; // 角色名称 data_scope: string; // 数据范围 assigned_at: string; // 分配时间(ISO 8601) } ``` --- ## 8. 错误码说明 ### 8.1 HTTP 状态码 | 状态码 | 说明 | |--------|------| | 200 | 成功 | | 400 | 请求参数错误 | | 401 | 未认证(Token无效或过期) | | 403 | 权限不足 | | 404 | 资源不存在 | | 409 | 资源冲突(如role_key重复) | | 500 | 服务器内部错误 | ### 8.2 业务错误码 统一响应格式: ```json { "code": 400, "message": "错误描述", "detail": "详细错误信息(可选)" } ``` 常见错误示例: ```json // 参数验证错误 { "code": 400, "message": "role_key只能包含小写字母、数字、下划线,且必须以字母开头" } // 权限不足 { "code": 403, "message": "权限不足: 需要 system:rbac:manage 权限" } // 资源不存在 { "code": 404, "message": "角色不存在: role_id=999" } // 系统角色保护 { "code": 400, "message": "系统角色不可删除" } // 核心权限保护 { "code": 400, "message": "provincial_admin 角色的核心权限不可移除" } ``` --- ## 9. 最佳实践 ### 9.1 权限检查流程 ```javascript // 前端示例:检查用户是否有 RBAC 管理权限 async function checkRbacPermission() { try { const response = await fetch('/api/v3/rbac/roles', { headers: { 'Authorization': `Bearer ${token}` } }); if (response.status === 403) { // 没有权限,隐藏管理功能 return false; } return true; } catch (error) { console.error('权限检查失败', error); return false; } } ``` --- ### 9.2 批量分配权限示例 ```javascript // 完全替换角色权限 async function replaceRolePermissions(roleId, permissions) { const response = await fetch('/api/v3/rbac/role-permissions', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ role_id: roleId, permissions: permissions, replace: true // 替换模式 }) }); return response.json(); } // 追加权限(不删除已有权限) async function addRolePermissions(roleId, newPermissions) { const response = await fetch('/api/v3/rbac/role-permissions', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ role_id: roleId, permissions: newPermissions, replace: false // 追加模式 }) }); return response.json(); } ``` --- ### 9.3 地区数据隔离示例 ```javascript // 获取角色用户时,自动按地区过滤 async function getRoleUsers(roleId) { // 后端会根据当前用户的 area 和 user_role 自动过滤 // 省级管理员:看到所有地区 // 市级管理员:只看到本地区 const response = await fetch(`/api/v3/rbac/roles/${roleId}/users`, { headers: { 'Authorization': `Bearer ${token}` } }); return response.json(); } ``` --- ### 9.4 错误处理示例 ```javascript async function createRole(roleData) { try { const response = await fetch('/api/v3/rbac/roles', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(roleData) }); const result = await response.json(); if (!response.ok) { // 根据状态码处理不同错误 switch (response.status) { case 400: console.error('参数错误:', result.message); break; case 401: console.error('未登录,请重新登录'); // 跳转到登录页 break; case 403: console.error('权限不足:', result.message); break; case 409: console.error('角色标识已存在'); break; case 500: console.error('服务器错误:', result.message); break; } throw new Error(result.message); } return result.data; } catch (error) { console.error('创建角色失败:', error); throw error; } } ``` --- ## 10. 完整接口清单 ### 接口总览(18个) | 分类 | 方法 | 路径 | 说明 | |------|------|------|------| | **角色管理** | GET | `/api/v3/rbac/roles` | 获取角色列表 | | | GET | `/api/v3/rbac/roles/{role_id}` | 获取角色详情 | | | POST | `/api/v3/rbac/roles` | 创建角色 | | | PUT | `/api/v3/rbac/roles/{role_id}` | 更新角色 | | | DELETE | `/api/v3/rbac/roles/{role_id}` | 删除角色 | | **权限管理** | GET | `/api/v3/rbac/permissions` | 获取权限列表(树形) | | | GET | `/api/v3/rbac/permissions/{permission_id}` | 获取权限详情 | | | POST | `/api/v3/rbac/permissions` | 创建权限 | | | PUT | `/api/v3/rbac/permissions/{permission_id}` | 更新权限 | | | DELETE | `/api/v3/rbac/permissions/{permission_id}` | 删除权限 | | **角色权限** | GET | `/api/v3/rbac/role-permissions` | 获取角色权限 ⭐ | | | POST | `/api/v3/rbac/role-permissions` | 批量分配权限 ⭐ | | | PUT | `/api/v3/rbac/role-permissions` | 更新单个权限 ⭐ | | | DELETE | `/api/v3/rbac/role-permissions` | 移除权限 ⭐ | | **用户角色** | GET | `/api/v3/rbac/roles/{role_id}/users` | 获取角色用户 | | | GET | `/api/v3/rbac/users/{user_id}/roles` | 获取用户角色 | | | POST | `/api/v3/rbac/users/{user_id}/roles` | 分配用户角色 | | | DELETE | `/api/v3/rbac/users/{user_id}/roles/{role_id}` | 移除用户角色 | --- ## 11. 联系方式 如有疑问,请联系后端开发团队。 **文档版本**: v3.4 **最后更新**: 2025-01-29 **维护者**: Claude AI Assistant