自定义 RBAC 角色 (Pro)
DefectDojo Pro 功能。 本页所述的成员 / 组 / 全局角色 RBAC 系统是 DefectDojo Pro 的一部分。开源版 DefectDojo 使用授权用户模型。有关开源版访问控制,请参见该页面;如果您正在版本之间迁移,请参见 3.0 升级说明。
DefectDojo Pro 内置了五种角色:只读者(Reader)、编写者(Writer)、维护者(Maintainer)、所有者(Owner) 和 API 导入者(API Importer)。如果这些角色都不适合您的需求,您现在可以通过精确选择要授予的权限来构建自己的角色。
自定义角色可以在内置角色能够使用的任何地方使用:作为全局角色、作为组的角色、作为默认组角色,以及作为单个组织或资产上的成员角色。
这五种内置角色成为锁定的、可克隆的预设。它们的权限保持不变(有关每种角色授予的权限,请参见操作权限图表),它们无法被编辑或删除,克隆其中一种角色是创建新角色的推荐方式。
开始之前
自定义角色管理默认处于关闭状态。超级用户可以通过启用设置(Settings) > 功能开关(Feature Flags) 中的自定义角色(Custom Roles) 来开启此功能。有关该页面的工作方式,请参见功能开关。
在该功能关闭时,角色页面仍然可读:您可以查看内置角色及其权限,但无法创建、编辑、克隆或删除任何内容。
管理角色需要超级用户状态或内置的所有者(Owner) 全局角色。这是刻意设计的,不能委派给自定义角色:请参见自定义全局角色可解锁的功能。
打开角色页面
前往左侧边栏中的 👤 用户(Users) > 角色(Roles)。该菜单项对超级用户和拥有内置所有者全局角色的用户可见。

该表列出了您实例中的每个角色:
| 列 | 显示内容 |
|---|---|
| ID | 角色的数字 ID。在筛选用户表或调用 API 时很有用。 |
| 名称(Name) | 角色名称。 |
| 描述(Description) | 您对该角色用途的说明。此项为可选,除非有人填写,否则为空。内置角色不附带此说明。 |
| 权限(Permissions) | 已授予权限的数量。点击可打开完整权限网格的只读视图。 |
| 用户(Users) | 有多少用户将此角色作为其全局角色持有。点击可在用户表中查看这些用户。 |
| 类型(Type) | 五种预设角色为内置(Built-in),您创建的角色为自定义(Custom)。 |
每一列都可排序和筛选,关键字搜索会匹配名称和描述。
创建角色
克隆内置角色(推荐)
克隆操作让您从一套已知可用的权限集开始,而不是从空白网格开始,这样就更不容易意外遗漏角色所需的权限。
- 找到与您需求最接近的角色。
- 打开其 ⋮ 菜单,选择克隆角色(Clone Role)。
- 系统会立即创建一个副本,命名为
<original> (copy),其权限和描述与来源角色相同。 - 打开该副本的 ⋮ 菜单,选择编辑角色(Edit Role),然后重命名并调整其权限。
内置角色虽然无法编辑,但可以被克隆。克隆出的角色会记录其来源角色。
从零开始创建
- 点击新建角色(New Role)。
- 为其填写名称(Name)(必填)和可选的描述(Description)。
- 在下方的网格中选择其权限(参见下一节)。
- 点击保存角色(Save Role)。
角色名称必须唯一,且检查时不区分大小写:如果已存在 Triage Lead,则 triage lead 会被拒绝。
选择权限

权限分为三张表加一份清单。
对象权限(Object Permissions) 适用于角色所分配到的组织和资产,以及它们下属的所有内容。
| 行 | 查看 | 添加 | 编辑 | 删除 |
|---|---|---|---|---|
| 组织 | ☑️ | ☑️ | ☑️ | ☑️ |
| 资产 | ☑️ | ☑️ ¹ | ☑️ | ☑️ |
| 测试活动 | ☑️ | ☑️ | ☑️ | ☑️ |
| 测试 | ☑️ | ☑️ | ☑️ | ☑️ |
| 发现项 | ☑️ | ☑️ | ☑️ | ☑️ |
| 发现项组 | ☑️ | ☑️ | ☑️ | ☑️ |
| 风险接受 | ☑️ | ☑️ | ☑️ | ☑️ |
| 位置 | ☑️ | ☑️ | ☑️ | ☑️ |
| 组件 | ☑️ | |||
| 备注 | ² | ☑️ | ☑️ | ☑️ |
| 基准 | ² | ☑️ | ☑️ | |
| 语言 | ☑️ | ☑️ | ☑️ | ☑️ |
| 技术 | ☑️ | ☑️ | ☑️ | ☑️ |
| 资产 API 扫描配置 | ☑️ | ☑️ | ☑️ | ☑️ |
| 资产跟踪文件 | ☑️ | ☑️ | ☑️ | ☑️ |
| 组 | ☑️ | ☑️ | ☑️ |
- 资产(Asset) > 添加(Add) 是指在角色所分配到的组织内创建新资产。
- 备注和基准的查看权限是继承而来的:能够查看父级测试活动、测试、发现项或资产的角色,就能查看其备注和基准。这些单元格显示的是 ? 图标,而不是复选框。
组与成员权限(Group & Member Permissions) 控制谁可以管理成员资格。此处的列为查看、管理、添加、添加所有者和编辑、删除。
| 行 | 可用操作 |
|---|---|
| 组织组、资产组 | 查看、添加、添加所有者、编辑、删除 |
| 组织成员、资产成员、组成员 | 管理、添加所有者、删除 |
全局功能权限(Global Feature Permissions) 控制的是实例范围内的 Pro 功能,而非单个组织或资产,因此只有当角色作为全局角色持有时才会生效。在仅用作资产成员资格的角色上授予这些权限不会产生任何效果。
| 行 | 可用操作 |
|---|---|
| 报告模板 | 查看、添加、编辑、删除 |
| 已生成报告 | 查看、添加、删除 |
| 连接器、Sensei、资产层级结构、版本管理器、调优器、通用解析器、规则、集成 | 查看、编辑 |
| 缓解策略 | 编辑 |
| 审计日志、计量 | 查看 |
附加权限(Additional Permissions) 是一份不符合查看/添加/编辑/删除模式的功能清单:
- 配置资产通知:选择单个资产发送哪些通知,以及发送到何处。
- 导入扫描结果:导入和重新导入扫描结果,创建和更新发现项。
- 共享仪表板布局:向其他用户发布仪表板布局。仅限全局角色。
- 共享表格偏好设置:发布已保存的表格视图(列、筛选器、排序顺序)。仅限全局角色。
- 查看备注历史记录:查看谁在何时更改了备注。
如何读懂网格

| 您看到的内容 | 含义 |
|---|---|
| 空复选框 | 该权限存在但未被授予。点击即可授予。 |
| 已勾选的复选框 | 已授予。 |
| 阴影处理的空单元格 | 该行和操作不存在此权限,不可选择。 |
| ? 图标 | 查看权限继承自父对象,因此此处无需授予。 |
| 绿色 ✔(只读视图) | 已授予。 |
| 红色 ✘(只读视图) | 未授予。 |
在每一行中,最左侧的权限(查看,或成员行中的管理)是该行其余权限的前提条件。您必须先授予该权限,该行中的其他单元格才会变为可用,因为角色无法对看不到的内容进行有意义的编辑或删除。清除该前提权限会同时清除该行的其余权限。
编辑、克隆和删除
每一行的 ⋮ 菜单都提供编辑角色(Edit Role)、克隆角色(Clone Role)、删除角色(Delete Role) 和角色历史记录(Role History)。
内置角色仅提供克隆角色选项。任何人(包括超级用户)都无法编辑或删除它们。这样可以保持一个已知的基准不变,并使升级过程可预测。
删除仍被分配给任何人的角色将会失败。请先重新分配或移除这些分配,然后再删除该角色。计入此项的分配包括组织和资产成员资格(用户和组均计入)、全局角色、组成员资格,以及系统设置中的默认组角色。
API 可以通过单次调用为您完成重新分配。请参见通过 API 管理角色。
分配自定义角色
自定义角色会与内置角色一起出现在每个角色下拉列表中:
| 位置 | 方式 |
|---|---|
| 用户上的全局角色 | 用户表单上的全局角色字段。仅限超级用户。请参见设置用户的权限。 |
| 组上的全局角色 | 组表单上的全局角色字段。请参见共享权限:用户组。 |
| 组织或资产成员资格 | 组织或资产上的权限对话框,适用于用户和组。请参见 Pro 中的权限设置。 |
| 默认组角色 | 系统设置中的默认组角色,应用于新创建的用户。请参见管理默认权限。 |
| 组内角色 | 组成员列表中的角色下拉列表。此下拉列表仅提供至少授予一项组权限的角色,因此没有任何组权限的角色不会出现在其中。 |
有两个限制值得了解:
- 所有者级别被保留。 自定义角色永远不能成为所有者级别的角色。只有内置的所有者角色才是,因此只有它拥有管理其他所有者的隐含权力。
- 将所有者角色授予他人仍需要相应的添加所有者权限,无论是在组织、资产还是组上进行操作。
自定义全局角色可解锁的功能
部分界面功能是基于最低全局角色而非单项权限来控制访问的。为了让自定义角色能够与这些限制协同工作,DefectDojo 会将自定义全局角色与内置层级进行对比排名:自定义角色会获得其权限完全覆盖的最高层级。
- 完全覆盖维护者所授予的全部权限的自定义角色,在这些限制中会被视为维护者。
- 完全覆盖编写者所授予的权限,则会被视为编写者。只读者同理。
- 若都无法完全覆盖,则不会获得任何层级。其各项权限仍会按所授予的方式正常工作;只是基于层级的界面限制仍会保持关闭状态。
- 所有者层级永远无法通过此方式获得。 角色管理以及其他所有基于所有者全局角色进行限制的功能,仍仅限超级用户和内置的所有者角色使用。
覆盖必须是完整的,这有时会让人感到意外。从维护者克隆而来的角色会获得维护者层级。若手动重建维护者的权限时遗漏了一项,该角色则会落到编写者层级。如果自定义全局角色缺少您预期中的界面功能,请将其与操作权限图表中的内置层级进行对比。
角色历史记录
自定义角色会保留审计跟踪。从角色的 ⋮ 菜单打开角色历史记录(Role History),即可查看哪些权限被授予或撤销、由谁操作、何时操作,以及持有该角色的用户发生的变更。
该历史记录不会显示以下两项内容:角色自身名称和描述的变更,以及内置角色的权限(这些权限是预置的,从不被编辑,因此不会产生历史记录)。
角色历史记录属于只读内容,因此无论自定义角色功能是否开启,都可以查看。
通过 API 管理角色
角色可通过 /api/v2/roles/ 访问。读取操作对任何已通过身份验证的用户开放,因为客户端需要角色列表来填充下拉菜单。写入操作需要超级用户状态或内置的所有者全局角色,并且需要启用自定义角色功能开关。
| 操作 | 请求 |
|---|---|
| 列出角色 | GET /api/v2/roles/ |
| 获取单个角色 | GET /api/v2/roles/{id}/ |
| 列出所有可授予的权限 | GET /api/v2/roles/permissions_catalog/ |
| 创建角色 | POST /api/v2/roles/,带 name、可选的 description 和 permissions 列表 |
| 替换角色的权限 | PATCH /api/v2/roles/{id}/,带 permissions 列表 |
| 克隆角色 | POST /api/v2/roles/{id}/clone/,带可选的 name 和 description |
| 删除角色 | DELETE /api/v2/roles/{id}/ |
| 删除角色并转移其分配 | DELETE /api/v2/roles/{id}/?reassign_to={other_role_id} |
| 读取角色的历史记录 | GET /api/v2/roles/{id}/history/ |
说明:
permissions会替换角色的授权列表,而不是在其基础上追加。请发送您希望该角色最终拥有的完整权限集合。?reassign_to=会在一次事务中,将被删除角色的所有分配转移到您指定的角色。这是批量重新分配的唯一方式:界面未提供此功能。- 尝试编辑或删除内置角色会返回
403。编辑未知的权限值、重复使用已存在的角色名称,或在未指定reassign_to的情况下删除正在使用中的角色,都会返回400并附带说明。 is_owner无法通过 API 设置。提交该字段会被接受但会被忽略。
须知事项
- 同一对象上的多个角色会授予其权限的并集。 如果用户直接在某资产上持有一个角色,又通过组继承了另一个角色,那么该用户会获得两个角色所授予的全部权限。角色只会增加权限,永远不会移除权限。
- 权限变更会在下次页面加载时生效,而不会在当前视图中立即生效。后台作业最多可能需要 30 秒,缓存的权限数据最多可能需要 5 分钟,才能反映出某项编辑。
- 角色下拉列表最多显示 250 个角色。 超过此数量后,部分角色将不会出现在下拉列表中,但它们仍会继续正常工作。
- 维护者和所有者可以添加组织,但网格中不会显示此项。 对于这两种角色,该授权以全局范围的授权形式存储,而网格只读取对象范围的授权,因此其组织 > 添加单元格显示为未授予。克隆这两种角色中的任意一种都会保留该授权。
- 术语遵循您实例的设置。 本文档使用默认标签“组织”和“资产”。如果您的实例关闭了组织/资产的重新标记功能,同样的行会显示为“产品类型”和“产品”。
- 角色页面对其他所有人都是只读的。 直接访问
/settings/roles的用户可以查看角色及其权限,但无法更改任何内容。权限数据并不敏感,服务器会在每次写入时强制执行真正的边界检查。