自定义角色

  • Tier: 旗舰版
  • Offering: JihuLab.com, 私有化部署
History
    • 自定义角色功能引入于极狐GitLab 15.7,使用名为 customizable_roles功能标志
    • 在极狐GitLab 15.9 中默认启用。
    • 在极狐GitLab 15.10 中删除功能标志。
    • 在 UI 上创建和移除自定义角色的能力引入于极狐GitLab 16.4。
    • 在 UI 上将用户添加到群组、更改用户自定义角色或从群组成员中移除自定义角色的能力引入于极狐GitLab 16.7。
    • 在极狐GitLab 私有化部署上创建和移除实例范围的自定义角色的能力引入于极狐GitLab 16.9。

自定义角色允许组织创建具有该组织需求所需的精确权限和许可的用户角色。

大多数自定义角色被视为[使用席位的计费用户](#billing-and-seat-usage)。当您使用自定义角色将用户添加到您的群组时,如果您因拥有超过订阅中包含的席位而即将产生额外费用,则会显示警告。

可用权限#

有关可用权限的更多信息,请参见自定义权限

根据添加到较低基础角色(例如 Guest)的权限,具有自定义角色的用户可能能够执行通常限制为 Maintainer 角色或更高角色的操作。例如,如果自定义角色是 Guest 加上管理 CI/CD 变量的权限,则具有此角色的用户可以管理其他 Maintainers 或 Owners 为该群组或项目添加的 CI/CD 变量。

创建自定义角色#

您可以通过向基础角色添加权限来创建自定义角色。您可以向该自定义角色添加多个权限。例如,您可以创建一个具有以下所有权限的自定义角色:

  • 查看漏洞报告。
  • 更改漏洞状态。
  • 批准合并请求。

极狐GitLab SaaS#

先决条件:

  • 您必须拥有顶级群组的 Owner 角色。
  1. 在左侧边栏中,选择 搜索或转到 并找到您的群组。
  2. 选择 设置 > 角色和权限
  3. 选择 新角色
  4. 用作模板的基础角色 中,选择现有的默认角色。
  5. 角色名称 中,输入自定义角色的标题。
  6. 描述 中,输入自定义角色的描述。最多 255 个字符。
  7. 选择新自定义角色的 权限
  8. 选择 创建角色

设置 > 角色和权限 中,显示所有自定义角色的列表:

  • 自定义角色名称。
  • 角色 ID。
  • 自定义角色使用的模板基础角色。
  • 权限。

极狐GitLab 私有化部署#

先决条件:

  • 您必须是极狐GitLab 私有化部署实例的管理员。

创建极狐GitLab 私有化部署实例的自定义角色后,您可以将该自定义角色分配给该实例中的任何群组或子群组中的用户。

  1. 在左侧边栏底部选择 管理员
  2. 选择 设置 > 角色和权限
  3. 选择 新角色
  4. 用作模板的基础角色 中,选择现有的默认角色。
  5. 角色名称 中,输入自定义角色的标题。
  6. 描述 中,输入自定义角色的描述。最多 255 个字符。
  7. 选择新自定义角色的 权限
  8. 选择 创建角色

设置 > 角色和权限 中,所有自定义角色的列表显示:

  • 自定义角色名称。
  • 角色 ID。
  • 自定义角色使用的模板基础角色。
  • 权限。

要创建自定义角色,您还可以使用 API

编辑自定义角色#

History
    • 引入于极狐GitLab 17.0。

创建自定义角色后,您可以编辑该自定义角色的名称、描述和权限。您无法更改基础角色。如果需要更改基础角色,则必须创建新的自定义角色。

极狐GitLab SaaS#

先决条件:

  • 您必须拥有群组的 Owner 角色。
  1. 在左侧边栏中,选择 搜索或转到 并找到您的群组。
  2. 选择 设置 > 角色和权限
  3. 为自定义角色选择垂直省略号 (),然后选择 编辑角色
  4. 根据需要修改角色。
  5. 选择 保存角色 来更新角色。

极狐GitLab 私有化部署#

先决条件:

  • 您必须是极狐GitLab 私有化部署实例的管理员。
  1. 在左侧边栏底部选择 管理员
  2. 选择 设置 > 角色和权限
  3. 为自定义角色选择垂直省略号 (),然后选择 编辑角色
  4. 根据需要修改角色。
  5. 选择 保存角色 来更新角色。

要编辑自定义角色,您还可以使用 API

删除自定义角色#

先决条件:

  • 您必须是管理员或拥有群组的 Owner 角色。

如果有成员被分配该角色,您无法从群组中移除自定义角色。请参见取消分配群组或项目成员的自定义角色

  1. 在左侧边栏中:
    • 对于极狐GitLab 私有化部署,选择底部的 管理员
    • 对于 SaaS,选择 搜索或转到 并找到您的群组。
  2. 选择 设置 > 角色和权限
  3. 选择 自定义角色
  4. 操作 列中,选择 删除角色 () 并确认。

您还可以使用 API 删除自定义角色。要使用 API,您必须提供自定义角色的 id。如果您不知道此 id,可以通过在群组上发起 API 请求 或在实例上发起 API 请求 来找到它。

将具有自定义角色的用户添加到您的群组或项目#

先决条件:

如果您要添加具有自定义角色的用户:

  • 到您的群组,您必须拥有群组的 Owner 角色。
  • 到您的项目,您必须至少拥有项目的 Maintainer 角色。

要添加具有自定义角色的用户:

如果群组或项目成员具有自定义角色,群组或项目成员列表在表格的 最大角色 列中显示 Custom Role

分配自定义角色给现有群组或项目成员#

先决条件:

如果您正在为现有成员分配自定义角色:

  • 群组成员,您必须拥有群组的 Owner 角色。
  • 项目成员,您必须至少拥有项目的 Maintainer 角色。

使用 UI 分配自定义角色#

  1. 在左侧边栏中,选择 搜索或转到 并找到您的群组或项目。
  2. 选择 管理 > 成员
  3. 最大角色 列中,选择成员的角色。打开 角色详情 抽屉。
  4. 使用 角色 下拉列表,选择要分配给成员的自定义角色。
  5. 选择 更新角色 来分配角色。

使用 API 分配自定义角色#

  1. 将用户作为顶级群组或顶级群组层次结构中任何子群组或项目的直接成员邀请为 Guest。此时,该 Guest 用户无法查看群组或子群组项目中的任何代码。

  2. 可选。如果您不知道接收自定义角色的 Guest 用户的 id,可以通过发起 API 请求找到该 id

  3. 使用 群组和项目成员 API 端点将成员与 Guest+1 角色关联:

    shell
    # 更新项目成员资格 curl --request PUT --header "Content-Type: application/json" --header "Authorization: Bearer <your_access_token>" --data '{"member_role_id": '<member_role_id>', "access_level": 10}' "https://gitlab.example.com/api/v4/projects/<project_id>/members/<user_id>" # 更新群组成员资格 curl --request PUT --header "Content-Type: application/json" --header "Authorization: Bearer <your_access_token>" --data '{"member_role_id": '<member_role_id>', "access_level": 10}' "https://gitlab.example.com/api/v4/groups/<group_id>/members/<user_id>"

    其中:

    • <project_id><group_id>:与接收自定义角色的成员资格相关联的项目或群组的 idURL 编码路径
    • <member_role_id>:在上一节中创建的成员角色的 id
    • <user_id>:接收自定义角色的用户的 id

    现在,Guest+1 用户可以查看与该成员资格相关的所有项目代码。

从群组或项目成员取消分配自定义角色#

先决条件:

如果您正在从以下成员中取消分配自定义角色:

  • 群组成员,您必须拥有群组的 Owner 角色。
  • 项目成员,您必须至少拥有项目的 Maintainer 角色。

您只能在没有群组或项目成员拥有该角色的情况下从群组或项目中移除自定义角色。要做到这一点,您可以使用以下方法之一:

使用 UI 更改用户角色#

要从群组成员中移除自定义角色:

  1. 在左侧边栏中,选择 搜索或转到 并找到您的群组。
  2. 选择 管理 > 成员
  3. 最大角色 列中,选择成员的角色。打开 角色详情 抽屉。
  4. 使用 角色 下拉列表,选择要分配给成员的默认角色。
  5. 选择 更新角色 来分配角色。

使用 API 更改用户角色#

您还可以使用 群组和项目成员 API 端点通过传递空的 member_role_id 值来更新或移除群组成员的自定义角色:

shell
# 更新项目成员资格 curl --request PUT --header "Content-Type: application/json" --header "Authorization: Bearer <your_access_token>" --data '{"member_role_id": null, "access_level": 10}' "https://gitlab.example.com/api/v4/projects/<project_id>/members/<user_id>" # 更新群组成员资格 curl --request PUT --header "Content-Type: application/json" --header "Authorization: Bearer <your_access_token>" --data '{"member_role_id": null, "access_level": 10}' "https://gitlab.example.com/api/v4/groups/<group_id>/members/<user_id>"

继承#

如果用户属于一个群组,他们是该群组的直接成员,并且是任何子群组或项目的继承成员。如果用户被顶级群组分配了自定义角色,则该角色的权限也被子群组和项目继承。

例如,假设存在以下结构:

  • 群组 A
    • 子群组 B
      • 项目 1

如果自定义角色具有 Developer 角色加上 Manage CI/CD variables 权限,则分配给群组 A 的用户在子群组 B 和项目 1 中也具有 Manage CI/CD variables 权限。

计费和席位使用#

当您为具有 Guest 角色的用户分配自定义角色时,该用户可以访问超过基础角色的高级权限,因此:

当用户的自定义角色仅启用 read_code 权限时,此项不适用。具有该特定权限的 Guest 用户不会被视为计费用户,并且不会使用席位。

将自定义角色分配给被邀请的群组#

History
    • 对于受邀群组自定义角色的支持引入于极狐GitLab 17.4,使用名为 assign_custom_roles_to_group_links_sm 的功能标志。默认禁用。
    • 在极狐GitLab 17.4 中,为 JihuLab.com 和私有化部署启用。
此功能的可用性受功能标志控制。有关更多信息,请参见历史记录。

当一个群组被邀请到另一个群组并具有自定义角色时,以下规则决定每个用户在新群组中的自定义权限:

  • 当用户在一个群组中具有自定义权限并且基础访问级别与其他群组中的默认角色相同或更高时,用户的最大角色为默认角色。即,用户被授予两者中的较低访问级别。
  • 当用户被邀请具有与其原始群组相同基础访问级别的自定义权限时,用户始终授予来自其原始群组的自定义权限。

例如,假设我们有 5 个用户在群组 A 中,并且他们被分配以下角色:

  • 用户 A:Guest 角色
  • 用户 B:Guest 角色 + read_code 自定义权限
  • 用户 C:Guest 角色 + read_vulnerability 自定义权限
  • 用户 D:Developer 角色
  • 用户 E:Developer + admin_vulnerability 自定义权限

群组 B 邀请群组 A。下表显示了群组 A 中的每个用户在群组 B 中的最大角色:

场景用户 A用户 B用户 C用户 D用户 E
群组 B 邀请群组 A 为 GuestGuestGuestGuestGuestGuest
群组 B 邀请群组 A 为 Guest + read_codeGuestGuest + read_codeGuest + read_vulnerabilityGuest + read_codeGuest + read_code
群组 B 邀请群组 A 为 Guest + read_vulnerabilityGuestGuest + read_codeGuest + read_vulnerabilityGuest + read_vulnerabilityGuest + read_vulnerability
群组 B 邀请群组 A 为 DeveloperGuestGuest + read_codeGuest + read_vulnerabilityDeveloperDeveloper
群组 B 邀请群组 A 为 Developer + admin_vulnerabilityGuestGuest + read_codeGuest + read_vulnerabilityDeveloperDeveloper + admin_vulnerability

当用户 C 被邀请到群组 B 并具有相同默认角色(Guest),但具有相同基础访问级别的不同自定义权限(read_coderead_vulnerability)时,用户 C 保留来自群组 A 的自定义权限(read_vulnerability)。

支持的对象#

您可以将自定义角色和权限分配给以下对象:

对象版本问题
用户15.9已发布
群组17.7部分支持。
令牌不支持

您可以使用以下身份验证提供者同步用户到自定义角色:

自定义管理员角色#

History
    • 引入于极狐GitLab 17.7,作为实验功能,使用名为 custom_ability_read_admin_dashboard 的功能标志。

先决条件:

  • 您必须是极狐GitLab 私有化部署实例的管理员。

您可以使用 API 创建分配自定义管理员角色。这些角色允许您授予有限访问管理员资源的权限。

有关可用权限的信息,请参见自定义权限

已知问题#

  • 如果具有自定义角色的用户与群组或项目共享,他们的自定义角色不会与他们一起转移。用户在新群组或项目中拥有常规 Guest 角色。
  • 您不能将 Auditor 用户用作自定义角色的模板。
  • 您的实例或命名空间只能有 10 个自定义角色。