Table of contents
Open Table of contents
一、角色类型及权限对比
角色 | 成员管理 | 应用管理 | 数据集管理 | API 密钥管理 | 系统配置 | 使用权限 |
---|---|---|---|---|---|---|
所有者 (Owner) | ✔️ 全部权限 | ✔️ 创建/编辑/删除 | ✔️ 创建/编辑/删除 | ✔️ 完整权限 | ✔️ 完整配置 | ✔️ 全部权限 |
管理员 (Admin) | ➖ 添加普通成员/编辑 | ✔️ 创建/编辑/删除 | ✔️ 创建/编辑/删除 | ❌ 无权限 | ⚠️ 部分权限 | ✔️ 全部权限 |
编辑者 (Editor) | ❌ 无 | ✔️ 创建/编辑 | ✔️ 创建/编辑 | ❌ 无权限 | ❌ 无 | ✔️ 协作使用 |
普通成员 (Normal) | ❌ 无 | ❌ 无 | ❌ 无 | ❌ 无权限 | ❌ 无 | ✔️ 使用 |
数据集操作员/知识库操作员 (Dataset Operator) | ❌ 无 | ❌ 无 | ✔️ 查询 / 上传 / 标注 | ❌ 无权限 | ❌ 无 | ❌ 无(除数据集外) |
说明:
dataset_operator
不是直接通过权限配置设置的用户,而是通过开放知识库权限限定的部分用户,只具有知识库相关操作权限
二、权限校验流程(Controller 层)
Dify 采用基于 Flask 装饰器 + 当前用户角色的多层权限控制机制:
@setup_required
@login_required
@account_initialization_required
用于校验初始化、登录状态。业务权限通过如下逻辑控制:
所有者校验
if not TenantAccountRole.is_privileged_role(current_user.role):
raise NoPermissionError("Only owner can perform this operation")
管理员及以上权限
if not TenantAccountRole.is_admin_role(current_user.role):
raise NoPermissionError("Only admin can perform this operation")
数据集操作权限(编辑/上传/清洗)
if not current_user.is_dataset_editor:
raise NoPermissionError("Operation requires dataset edit permission")
三、角色能力详解
所有者(Owner)
-
职责:系统初始化人,最高权限持有者。
-
权限:
- 管理所有成员(含 admin)
- 更改所有角色权限(含转让所有者)
- 控制系统设置、账单、API 配额
- 可解散租户(团队、Tenant)
管理员(Admin)
-
职责:辅助管理。
-
权限:
- 添加普通成员与编辑者
- 管理所有资源(应用,不包括知识库,知识库权限需要额外分配)
- 无法管理其他管理员或所有者
编辑者(Editor)
-
职责:创建内容(应用、知识库)。
-
权限:
- 管理自身创建的资源
- 编辑数据集(上传文档、标注)
- 设置权限(但不可移除他人)
普通成员(Normal)
-
职责:普通使用者。
-
权限:
- 使用可访问应用和知识库
- 不能编辑、创建或设置任何资源
- 管理个人偏好与使用记录
数据集操作员(Dataset Operator)
-
职责:数据集维护与运营。
-
权限:
- 查看/上传文档
- 执行知识库内搜索、清洗、标注等操作
- 修改数据集配置或权限(除数据集创建者外)
四、知识库(数据集)权限控制机制
权限策略字段:datasets.permission
only_me
:仅创建者可访问all_team_members
:租户下所有成员可访问partial_members
:需显式授权,通过dataset_permissions
表定义
权限控制校验逻辑
if not DatasetService.check_dataset_permission(dataset, current_user):
raise NoPermissionError("No permission to access this dataset")
编辑权限判断逻辑(上传、清洗)
if not current_user.is_dataset_editor:
raise NoPermissionError()
支持角色:owner, admin, editor, dataset_operator
五、错误响应标准
场景 | 状态码 | 示例响应 |
---|---|---|
权限不足 | 403 | { "error": "NoPermissionError", "message": "You do not have permission to do this" } |
参数错误 | 400 | { "error": "ValidationError", "message": "Invalid parameter specified" } |
操作冲突(唯一所有者) | 409 | { "error": "ConflictError", "message": "Cannot remove the only owner" } |
资源不存在 | 404 | { "error": "NotFoundError", "message": "Resource not found" } |