授权
在 Red Hat Developer Hub 中使用基于角色的访问控制(RBAC)配置授权
摘要
前言 复制链接链接已复制到粘贴板!
在 Authentication 中,您将了解如何向 Red Hat Developer Hub 验证用户。开发人员 Hub 知道用户是谁。
在本书中,了解如何授权用户在 Developer Hub 中执行操作。定义在 Developer Hub 中用户可以做什么。
基于角色的访问控制(RBAC)是一种安全概念,用于控制对系统中的资源的访问,并指定了系统用户之间的映射,以及它们可以对系统中的资源执行的操作。您可以使用特定权限定义角色,然后将角色分配给用户和组。
Developer Hub 上的 RBAC 基于 Permissions 框架构建,该框架在代码中定义 RBAC 策略。Developer Hub RBAC 功能请参阅在代码中定义策略,而是使用简单的基于 CSV 的格式以声明方式定义策略。您可以使用 Developer Hub Web 界面或 REST API 来定义策略,而不是直接编辑 CSV。
在 Developer Hub 中定义授权:
- Developer Hub 管理员启用并授予对 RBAC 功能的访问权限。
您可以通过组合以下方法来定义角色和策略:
- Developer Hub 策略管理员使用 Developer Hub Web 界面或 REST API。
- Developer Hub 管理员编辑主 Developer Hub 配置文件。
- Developer Hub 管理员编辑外部文件。
第 1 章 启用并提供基于角色的访问控制(RBAC)功能的访问权限 复制链接链接已复制到粘贴板!
基于角色的访问控制(RBAC)功能默认为禁用。启用 RBAC 插件并声明策略管理员以使用 RBAC 功能启动。
Developer Hub 中用户和组的权限策略由权限策略管理员管理。只有权限策略管理员才能访问基于角色的访问控制 REST API。
先决条件
- 您已 添加了自定义 Developer Hub 应用程序配置,并有足够的权限来修改它。
- 您已 启用了身份验证提供程序。
流程
RBAC 插件已安装,但默认禁用。要启用
./dynamic-plugins/dist/janus-idp-backstage-plugin-rbac插件,请使用以下内容编辑您的dynamic-plugins.yaml。dynamic-plugins.yaml片段plugins: - package: ./dynamic-plugins/dist/janus-idp-backstage-plugin-rbac disabled: false请参阅 安装和查看动态插件。
声明策略管理员,以启用选择数量的经过身份验证的用户,以通过 REST API 或 Web UI 配置 RBAC 策略,而不是直接修改 CSV 文件。权限可以在
app-config-rhdhConfigMap 中引用的单独 CSV 文件中指定,也可以使用 REST API 或 Web UI 创建权限。要将 < your_policy_administrator_name> 等用户声明为策略管理员,请编辑自定义 Developer Hub ConfigMap,如
app-config-rhdh,并将以下代码添加到app-config-rhdh.yaml内容中:app-config.yaml片段permission: enabled: true rbac: admin: users: - name: user:default/<your_policy_administrator_name>
验证
- 从现有的 Red Hat Developer Hub 会话注销,并使用声明的策略管理员帐户再次登录。
启用 RBAC 后,大多数功能都会默认禁用。
- 导航到 RHDH 中的 Catalog 页面。Create 按钮不可见。您无法创建新组件。
- 导航到 API 页面。Register 按钮不可见。
后续步骤
- 明确启用对 Developer Hub 中资源的权限。
第 2 章 确定权限策略和角色配置源 复制链接链接已复制到粘贴板!
您可以使用不同源配置 Red Hat Developer Hub 策略和角色。为了保持数据一致性,Developer Hub 将每个权限策略和角色与一个唯一源相关联。您只能使用这个源来更改资源。
可用的源有:
- 配置文件
在 Developer Hub
app-config.yaml配置文件中配置角色和策略,以便实例 声明您的策略管理员。配置文件与 RBAC 插件提供的默认
role:default/rbac_admin角色相关。默认角色具有创建、读取、更新、删除权限策略或角色以及读取目录实体的权限。注意如果您的管理要求默认权限不足,您可以创建具有所需权限策略的自定义 admin 角色。
- REST API
- 使用 Developer Hub Web UI 或使用 REST API 配置角色和策略。
- CSV 文件
- 使用外部 CSV 文件配置角色和策略。
- Legacy
传统源适用于在 RBAC 后端插件版本
2.1.3之前定义的策略和角色,并且是源位置选项中最严格的限制。重要使用 REST API 或 CSV 文件源将使用旧源的权限和角色替换为权限。
流程
-
要确定角色或策略的来源,请使用
GET请求。
第 3 章 使用 Red Hat Developer Hub Web UI 管理基于角色的访问控制(RBAC) 复制链接链接已复制到粘贴板!
策略管理员可以使用 Developer Hub Web 界面(Web UI)为单独的用户或组分配特定的角色和权限。分配角色可确保在 Developer Hub 中控制资源和功能的访问。
使用 Developer Hub 中的策略管理员角色,您可以为用户和组分配权限。此角色允许您使用 Developer Hub Web UI 查看、创建、修改和删除角色。
3.1. 在 Red Hat Developer Hub Web UI 中创建角色 复制链接链接已复制到粘贴板!
您可以使用 Web UI 在 Red Hat Developer Hub 中创建角色。
流程
进入 Developer Hub 中边栏底部的 管理。
此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。
- (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
- 单击 CREATE 以创建角色。
- 在给定字段中输入角色的名称和描述,然后单击 NEXT。
- 使用搜索字段添加用户和组,然后单击 NEXT。
- 从 Add permission policies 部分中的下拉列表中,选择 Plugin 和 Permission。
- 选择或清除您要在 Add permissions policies 部分中设置的 Policy,然后单击 NEXT。
- 查看 Review and create 部分中的添加的信息。
- 点 CREATE。
验证
创建的角色会出现在 RBAC 选项卡中可用的列表中。
3.2. 在 Red Hat Developer Hub Web UI 中编辑角色 复制链接链接已复制到粘贴板!
您可以使用 Web UI 在 Red Hat Developer Hub 中编辑角色。
从 policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。
先决条件
- 您已启用了 RBAC,并在 Developer Hub 中有一个策略管理员角色。
- 您要编辑的角色在 Developer Hub 中创建。
流程
进入 Developer Hub 中边栏底部的 管理。
此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。
- (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
- 选择您要编辑的角色的编辑图标。
- 编辑角色的详细信息,如名称、描述、用户和组以及权限策略,然后单击 NEXT。
- 检查角色的编辑详细信息,然后单击 SAVE。
编辑角色后,您可以查看角色的 OVERVIEW 页面上 角色的 编辑详情。您还可以使用 OVERVIEW 页面中的编辑图标来编辑角色的用户和组或权限。
3.3. 删除 Red Hat Developer Hub Web UI 中的角色 复制链接链接已复制到粘贴板!
您可以使用 Web UI 删除 Red Hat Developer Hub 中的角色。
从 policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。
先决条件
- 您已启用了 RBAC,并在 Developer Hub 中有一个策略管理员角色。
- 要删除的角色在 Developer Hub 中创建。
流程
进入 Developer Hub 中边栏底部的 管理。
此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。
- (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
从您要删除的角色的 Actions 列中选择 delete 图标。
删除此角色? 弹出会出现在屏幕上。
- 点 DELETE。
第 4 章 使用 REST API 管理授权 复制链接链接已复制到粘贴板!
要自动维护 Red Hat Developer Hub 权限策略和角色,您可以使用 Developer Hub 基于角色的访问控制(RBAC) REST API。
您可以使用 REST API 执行以下操作:
检索有关以下相关信息:
- 所有权限策略
- 特定权限策略
- 特定角色
- 静态插件权限策略
创建、更新或删除:
- 权限策略
- 角色
4.1. 使用 curl 工具将请求发送到 RBAC REST API 复制链接链接已复制到粘贴板!
您可以使用 curl 实用程序发送 RBAC REST API 请求。
先决条件
流程
查找 Bearer 令牌以向 REST API 进行身份验证。
- 在您的浏览器中,打开 Web 控制台 网络 选项卡。
- 在主屏幕中,重新载入 Developer Hub Homepage。
-
在 Web 控制台 网络 选项卡中,搜索
query?term=网络调用。 - 将 令牌 保存到响应 JSON 中,以获取后续步骤。
在终端中运行 curl 命令并查看响应:
GET或DELETE请求curl -v \ -H "Authorization: Bearer <token>" \ -X <method> "https://<my_developer_hub_url>/<endpoint>" \需要 JSON 正文数据的
POST或PUT请求curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer <token>" \ -X POST "https://<my_developer_hub_url>/<endpoint>" \ -d <body>创建角色的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer <token>" \ -X POST "https://<my_developer_hub_url>/api/permission/roles" \ -d '{ "memberReferences": ["group:default/example"], "name": "role:default/test", "metadata": { "description": "This is a test role" } }'更新角色的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer <token>" \ -X PUT "https://<my_developer_hub_url>/api/permission/roles/role/default/test" \ -d '{ "oldRole": { "memberReferences": [ "group:default/example" ], "name": "role:default/test" }, "newRole": { "memberReferences": [ "group:default/example", "user:default/test" ], "name": "role:default/test" } }'创建权限策略的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer $token" \ -X POST "https://<my_developer_hub_url>/api/permission/policies" \ -d '[{ "entityReference":"role:default/test", "permission": "catalog-entity", "policy": "read", "effect":"allow" }]'更新权限策略的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer $token" \ -X PUT "https://<my_developer_hub_url>/api/permission/policies/role/default/test" \ -d '{ "oldPolicy": [ { "permission": "catalog-entity", "policy": "read", "effect": "allow" } ], "newPolicy": [ { "permission": "policy-entity", "policy": "read", "effect": "allow" } ] }'创建条件的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer $token" \ -X POST "https://<my_developer_hub_url>/api/permission/roles/conditions" \ -d '{ "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": {"claims": ["group:default/janus-authors"]} } }'更新条件的请求示例
curl -v -H "Content-Type: application/json" \ -H "Authorization: Bearer $token" \ -X PUT "https://<my_developer_hub_url>/api/permission/roles/conditions/1" \ -d '{ "result":"CONDITIONAL", "roleEntityRef":"role:default/test", "pluginId":"catalog", "resourceType":"catalog-entity", "permissionMapping": ["read", "update", "delete"], "conditions": { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": {"claims": ["group:default/janus-authors"]} } }'
验证
查看返回的 HTTP 状态代码:
200OK- 请求成功。
201created- 请求会导致成功创建新资源。
204无内容- 请求成功,响应有效负载没有更多内容。
400错误请求- 输入错误以及请求。
401未授权- 缺少请求资源的有效身份验证。
403Forbidden- 退款以授权请求。
404not Found- 无法找到所请求的资源。
409冲突- 请求与当前状态和目标资源冲突。
4.2. 使用 REST 客户端将请求发送到 RBAC REST API 复制链接链接已复制到粘贴板!
您可以使用任何 REST 客户端发送 RBAC REST API 请求。
先决条件
流程
查找 Bearer 令牌以向 REST API 进行身份验证。
- 在您的浏览器中,打开 Web 控制台 网络 选项卡。
- 在主屏幕中,重新载入 Developer Hub Homepage。
-
在 Web 控制台 网络 选项卡中,搜索
query?term=网络调用。 - 将 令牌 保存到响应 JSON 中,以获取后续步骤。
在 REST 客户端中,使用以下参数运行命令并查看响应:
4.3. 支持的 RBAC REST API 端点 复制链接链接已复制到粘贴板!
RBAC REST API 提供了在 Developer Hub 中管理角色、权限和条件策略的端点,并检索有关角色和策略的信息。
4.3.1. 角色 复制链接链接已复制到粘贴板!
RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的角色。
- [GET] /api/permission/roles
返回 Developer Hub 中的所有角色。
响应示例(JSON)
[ { "memberReferences": ["user:default/username"], "name": "role:default/guests" }, { "memberReferences": [ "group:default/groupname", "user:default/username" ], "name": "role:default/rbac_admin" } ]- [GET] /api/permission/roles/<kind>/<namespace>/<name>
返回 Developer Hub 中单个角色的信息。
响应示例(JSON)
[ { "memberReferences": [ "group:default/groupname", "user:default/username" ], "name": "role:default/rbac_admin" } ]- [POST] /api/permission/roles/<kind>/<namespace>/<name>
在 Developer Hub 中创建角色。
Expand 表 4.1. 请求参数 Name 描述 类型 存在 正文(body)memberReferences、组、namespace并将新角色命名为要创建的新角色。请求正文
必填
请求正文示例(JSON)
{ "memberReferences": ["group:default/test"], "name": "role:default/test_admin" }响应示例
201 Created- [PUT] /api/permission/roles/ <kind> / <namespace> / <name>
为 Developer Hub 中的角色更新
memberReferences、类型、namespace或name。请求参数
请求正文包含
oldRole和newRole对象:Expand Name 描述 类型 存在 正文(body)memberReferences、组、namespace并将新角色命名为要创建的新角色。请求正文
必填
请求正文示例(JSON)
{ "oldRole": { "memberReferences": ["group:default/test"], "name": "role:default/test_admin" }, "newRole": { "memberReferences": ["group:default/test", "user:default/test2"], "name": "role:default/test_admin" } }响应示例
200 OK- [DELETE] /api/permission/roles/<kind>/<namespace>/<name>?memberReferences=<VALUE>
从 Developer Hub 中的角色中删除指定的用户或组。
Expand 表 4.2. 请求参数 Name 描述 类型 存在 kind实体的类型
字符串
必填
namespace实体的命名空间
字符串
必填
name实体的名称
字符串
必填
memberReferences关联的组信息
字符串
必填
响应示例
204- [DELETE] /api/permission/roles/<kind>/<namespace>/<name>
从 Developer Hub 删除指定的角色。
Expand 表 4.3. 请求参数 Name 描述 类型 存在 kind实体的类型
字符串
必填
namespace实体的命名空间
字符串
必填
name实体的名称
字符串
必填
响应示例
204
4.3.2. 权限策略 复制链接链接已复制到粘贴板!
RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的权限策略。
- [GET] /api/permission/policies
返回所有用户的权限策略列表。
响应示例(JSON)
[ { "entityReference": "role:default/test", "permission": "catalog-entity", "policy": "read", "effect": "allow", "metadata": { "source": "csv-file" } }, { "entityReference": "role:default/test", "permission": "catalog.entity.create", "policy": "use", "effect": "allow", "metadata": { "source": "csv-file" } }, ]- [GET] /api/permission/policies/<kind>/<namespace>/<name>
返回与指定实体引用相关的权限策略。
Expand 表 4.4. 请求参数 Name 描述 类型 存在 kind实体的类型
字符串
必填
namespace实体的命名空间
字符串
必填
name与实体相关的名称
字符串
必填
响应示例(JSON)
[ { "entityReference": "role:default/test", "permission": "catalog-entity", "policy": "read", "effect": "allow", "metadata": { "source": "csv-file" } }, { "entityReference": "role:default/test", "permission": "catalog.entity.create", "policy": "use", "effect": "allow", "metadata": { "source": "csv-file" } } ]- [POST] /api/permission/policies
为指定实体创建权限策略。
Expand 表 4.5. 请求参数 Name 描述 类型 存在 entityReference实体的引用值,包括
类型、namespace和name字符串
必填
权限特定插件、资源类型或名称的权限
字符串
必填
policy权限的策略操作,如创建、
读取、更新、删除或使用字符串
必填
effect表示允许或不允许策略
字符串
必填
请求正文示例(JSON)
[ { "entityReference": "role:default/test", "permission": "catalog-entity", "policy": "read", "effect": "allow" } ]响应示例
201 Created- [PUT] /api/permission/policies/<kind>/<namespace>/<name>
更新指定实体的权限策略。
请求参数
请求正文包含
oldPolicy和newPolicy对象:Expand Name 描述 类型 存在 权限特定插件、资源类型或名称的权限
字符串
必填
policy权限的策略操作,如创建、
读取、更新、删除或使用字符串
必填
effect表示允许或不允许策略
字符串
必填
请求正文示例(JSON)
{ "oldPolicy": [ { "permission": "catalog-entity", "policy": "read", "effect": "allow" }, { "permission": "catalog.entity.create", "policy": "create", "effect": "allow" } ], "newPolicy": [ { "permission": "catalog-entity", "policy": "read", "effect": "deny" }, { "permission": "policy-entity", "policy": "read", "effect": "allow" } ] }响应示例
200- [DELETE] /api/permission/policies/ <kind> / <namespace> / <name > ?permission={value1}&policy={value2}&effect={value3}
删除添加到指定实体的权限策略。
Expand 表 4.6. 请求参数 名称 描述 类型 存在 kind实体的类型
字符串
必填
namespace实体的命名空间
字符串
必填
name与实体相关的名称
字符串
必填
权限特定插件、资源类型或名称的权限
字符串
必填
policy权限的策略操作,如创建、
读取、更新、删除或使用字符串
必填
effect表示允许或不允许策略
字符串
必填
响应示例
204 No Content- [DELETE] /api/permission/policies/<kind>/<namespace>/<name>
删除添加到指定实体的所有权限策略。
Expand 表 4.7. 请求参数 名称 描述 类型 存在 kind实体的类型
字符串
必填
namespace实体的命名空间
字符串
必填
name与实体相关的名称
字符串
必填
响应示例
204 No Content- [GET] /api/permission/plugins/policies
返回所有静态插件的权限策略。
响应示例(JSON)
[ { "pluginId": "catalog", "policies": [ { "isResourced": true, "permission": "catalog-entity", "policy": "read" }, { "isResourced": false, "permission": "catalog.entity.create", "policy": "create" }, { "isResourced": true, "permission": "catalog-entity", "policy": "delete" }, { "isResourced": true, "permission": "catalog-entity", "policy": "update" }, { "isResourced": false, "permission": "catalog.location.read", "policy": "read" }, { "isResourced": false, "permission": "catalog.location.create", "policy": "create" }, { "isResourced": false, "permission": "catalog.location.delete", "policy": "delete" } ] }, ... ]
4.3.3. 条件策略 复制链接链接已复制到粘贴板!
RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的条件策略。
- [GET] /api/permission/plugins/condition-rules
为 Developer Hub 中启用的可用插件返回可用条件规则参数模式。
响应示例(JSON)
[ { "pluginId": "catalog", "rules": [ { "name": "HAS_ANNOTATION", "description": "Allow entities with the specified annotation", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "annotation": { "type": "string", "description": "Name of the annotation to match on" }, "value": { "type": "string", "description": "Value of the annotation to match on" } }, "required": [ "annotation" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }, { "name": "HAS_LABEL", "description": "Allow entities with the specified label", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "label": { "type": "string", "description": "Name of the label to match on" } }, "required": [ "label" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }, { "name": "HAS_METADATA", "description": "Allow entities with the specified metadata subfield", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "key": { "type": "string", "description": "Property within the entities metadata to match on" }, "value": { "type": "string", "description": "Value of the given property to match on" } }, "required": [ "key" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }, { "name": "HAS_SPEC", "description": "Allow entities with the specified spec subfield", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "key": { "type": "string", "description": "Property within the entities spec to match on" }, "value": { "type": "string", "description": "Value of the given property to match on" } }, "required": [ "key" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }, { "name": "IS_ENTITY_KIND", "description": "Allow entities matching a specified kind", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "kinds": { "type": "array", "items": { "type": "string" }, "description": "List of kinds to match at least one of" } }, "required": [ "kinds" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }, { "name": "IS_ENTITY_OWNER", "description": "Allow entities owned by a specified claim", "resourceType": "catalog-entity", "paramsSchema": { "type": "object", "properties": { "claims": { "type": "array", "items": { "type": "string" }, "description": "List of claims to match at least one on within ownedBy" } }, "required": [ "claims" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } } ] } ... <another plugin condition parameter schemas> ]- [GET] /api/permission/roles/conditions/:id
返回指定 ID 的条件。
响应示例(JSON)
{ "id": 1, "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ] } }- [GET] /api/permission/roles/conditions
返回所有角色的所有条件列表。
响应示例(JSON)
[ { "id": 1, "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ] } } ]- [POST] /api/permission/roles/conditions
为指定角色创建条件策略。
Expand 表 4.8. 请求参数 名称 描述 类型 存在 result始终值为
CONDITIONAL字符串
必填
roleEntityRef对 RBAC 角色的字符串实体引用,如
role:default/dev字符串
必填
pluginId对应的插件 ID,如
目录字符串
必填
permissionMapping数组权限操作,如
['read', 'update', 'delete']字符串数组
必填
resourceType插件提供的资源类型,如
catalog-entity字符串
必填
conditions带有参数或数组参数的条件 JSON,按条件加入
JSON
必填
name角色的名称
字符串
必填
metadata.description角色的描述
字符串
选填
请求正文示例(JSON)
{ "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } } }响应示例(JSON)
{ "id": 1 }- [PUT] /permission/roles/conditions/:id
更新指定 ID 的条件策略。
Expand 表 4.9. 请求参数 名称 描述 类型 存在 result始终值为
CONDITIONAL字符串
必填
roleEntityRef对 RBAC 角色的字符串实体引用,如
role:default/dev字符串
必填
pluginId对应的插件 ID,如
目录字符串
必填
permissionMapping数组权限操作,如
['read', 'update', 'delete']字符串数组
必填
resourceType插件提供的资源类型,如
catalog-entity字符串
必填
conditions带有参数或数组参数的条件 JSON,按条件加入
JSON
必填
name角色的名称
字符串
必填
metadata.description角色的描述
字符串
选填
请求正文示例(JSON)
{ "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ] } }响应示例
200- [DELETE] /api/permission/roles/conditions/:id
删除指定 ID 的条件策略。
响应示例
204
4.3.4. 用户统计 复制链接链接已复制到粘贴板!
licensed-users-info-backend 插件公开各种 REST API 端点,以检索与登录用户相关的数据。
licensed-users-info-backend 插件不需要额外的配置。如果启用了 RBAC 后端插件,则必须分配管理员角色来访问端点,因为端点由 policy.entity.read 权限保护。
用户统计端点的基本 URL 是 http://SERVER:PORT/api/licensed-users-info,如 http://localhost:7007/api/licensed-users-info。
- [GET] /users/quantity
返回登录用户总数。
请求示例
curl -X GET "http://localhost:7007/api/licensed-users-info/users/quantity" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $token"响应示例
{ "quantity": "2" }- [GET] /users
返回登录的用户列表及其详情。
请求示例
curl -X GET "http://localhost:7007/api/licensed-users-info/users" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $token"响应示例
[ { "userEntityRef": "user:default/dev", "lastTimeLogin": "Thu, 22 Aug 2024 16:27:41 GMT", "displayName": "John Leavy", "email": "dev@redhat.com" } ]- [GET] /users
返回 CSV 格式的登录用户列表。
请求示例
curl -X GET "http://localhost:7007/api/licensed-users-info/users" \ -H "Content-Type: text/csv" \ -H "Authorization: Bearer $token"响应示例
userEntityRef,displayName,email,lastTimeLogin user:default/dev,John Leavy,dev@redhat.com,"Thu, 22 Aug 2024 16:27:41 GMT"
第 5 章 使用外部文件管理授权 复制链接链接已复制到粘贴板!
要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中配置权限和角色。
5.1. 使用 Operator 在外部文件中定义授权 复制链接链接已复制到粘贴板!
要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中定义权限和角色。您需要准备文件,将其上传到 OpenShift Container Platform 项目中,并将 Developer Hub 配置为使用外部文件。
先决条件
流程
使用以下格式在
rbac-policies.csvCSV 文件中定义您的策略:定义角色权限:
p, <role_entity_reference>, <permission>, <action>, <allow_or_deny>- <role_entity_reference>
-
角色实体引用,例如:
role:default/guest。 - <permission>
权限,如:
bulk.import、catalog.entity.read或catalog.entity.refresh,或权限资源类型,如bulk-import或catalog-entity。请参阅: 权限策略参考。
- <action>
-
操作类型,例如:
使用、读取、创建、更新、删除。 - <allow_or_deny>
-
授予访问权限:
.允许或拒绝
为组或用户分配角色:
g, <group_or_user>, <role_entity_reference>- <group_or_user>
组,如
user:default/mygroup或 user,例如:user:default/myuser。Sample
rbac-policies.csvp, role:default/guests, catalog-entity, read, allow p, role:default/guests, catalog.entity.create, create, allow g, user:default/my-user, role:default/guests g, group:default/my-group, role:default/guests
使用以下格式在
rbac-conditional-policies.yamlYAML 文件中定义条件策略:result: CONDITIONAL roleEntityRef: <role_entity_reference> pluginId: <plugin_id> permissionMapping: - read - update - delete conditions: <conditions>请参阅: 条件策略参考。
将
rbac-policies.csv和rbac-conditional-policies.yaml文件上传到包含 Developer Hub 的 OpenShift Container Platform 项目中的rbac-policies配置映射。$ oc create configmap rbac-policies \ --from-file=rbac-policies.csv \ --from-file=rbac-conditional-policies.yaml更新 Developer Hub
Backstage自定义资源,从rbac-policies配置映射中挂载您的文件的 Developer Hub 文件系统:Backstage自定义资源片段apiVersion: rhdh.redhat.com/v1alpha1 kind: Backstage spec: application: extraFiles: mountPath: /opt/app-root/src configMaps: - name: rbac-policies更新 Developer Hub
app-config.yaml配置文件,以使用rbac-policies.csv和rbac-conditional-policies.yaml外部文件:app-config.yml片段permission: enabled: true rbac: conditionalPoliciesFile: /opt/app-root/src/rbac-conditional-policies.yaml policies-csv-file: /opt/app-root/src/rbac-policies.csv policyFileReload: true
5.2. 使用 Helm 在外部文件中定义授权 复制链接链接已复制到粘贴板!
要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中定义权限和角色。您需要准备文件,将其上传到 OpenShift Container Platform 项目中,并将 Developer Hub 配置为使用外部文件。
先决条件
流程
使用以下格式在
rbac-policies.csvCSV 文件中定义您的策略:定义角色权限:
p, <role_entity_reference>, <permission>, <action>, <allow_or_deny>- <role_entity_reference>
-
角色实体引用,例如:
role:default/guest。 - <permission>
权限,如:
bulk.import、catalog.entity.read或catalog.entity.refresh,或权限资源类型,如bulk-import或catalog-entity。请参阅: 权限策略参考。
- <action>
-
操作类型,例如:
使用、读取、创建、更新、删除。 - <allow_or_deny>
-
授予访问权限:
.允许或拒绝
为组或用户分配角色:
g, <group_or_user>, <role_entity_reference>- <group_or_user>
组,如
user:default/mygroup或 user,例如:user:default/myuser。Sample
rbac-policies.csvp, role:default/guests, catalog-entity, read, allow p, role:default/guests, catalog.entity.create, create, allow g, user:default/my-user, role:default/guests g, group:default/my-group, role:default/guests
使用以下格式在
rbac-conditional-policies.yamlYAML 文件中定义条件策略:result: CONDITIONAL roleEntityRef: <role_entity_reference> pluginId: <plugin_id> permissionMapping: - read - update - delete conditions: <conditions>请参阅: 条件策略参考。
将
rbac-policies.csv和rbac-conditional-policies.yaml文件上传到包含 Developer Hub 的 OpenShift Container Platform 项目中的rbac-policies配置映射。$ oc create configmap rbac-policies \ --from-file=rbac-policies.csv \ --from-file=rbac-conditional-policies.yaml更新 Developer Hub
BackstageHelm Chart,以挂载到rbac-policies配置映射中的 Developer Hub 文件系统:- 在 Developer Hub Helm Chart 中,进入 Root Schema → Backstage chart schema → Backstage parameters → Backstage container additional volume mount。
选择 Add Backstage 容器附加卷挂载 并添加以下值:
- mountPath
-
/opt/app-root/src/rbac - 名称
-
rbac-policies
将 RBAC 策略添加到 Developer Hub Helm Chart 中的 Backstage 容器 附加卷:
- 名称
-
rbac-policies - configMap
- defaultMode
-
420 - 名称
-
rbac-policies
更新 Developer Hub
app-config.yaml配置文件,以使用rbac-policies.csv和rbac-conditional-policies.yaml外部文件:app-config.yml片段permission: enabled: true rbac: conditionalPoliciesFile: /opt/app-root/src/rbac-conditional-policies.yaml policies-csv-file: /opt/app-root/src/rbac-policies.csv policyFileReload: true
第 6 章 使用 RBAC UI 配置客户机访问 复制链接链接已复制到粘贴板!
使用带有基于角色的访问控制(RBAC)前端插件的客户机访问权限,允许用户测试角色和策略创建,而无需设置和配置身份验证供应商。
不建议在生产环境中使用客户机访问。
6.1. 配置 RBAC 后端插件 复制链接链接已复制到粘贴板!
您可以通过更新 app-config.yaml 文件来启用权限框架来配置 RBAC 后端插件。
先决条件
-
您已在 Developer Hub 中安装了
@janus-idp/backstage-plugin-rbac插件。如需更多信息,请参阅配置动态插件。
流程
-
更新
app-config.yaml文件,以启用权限框架,如下所示:
permission
enabled: true
rbac:
admin:
users:
- name: user:default/guest
pluginsWithPermission:
- catalog
- permission
- scaffolder
app-config.yaml 部分中的 pluginsWithPermission 部分默认只包含三个插件。根据需要更新 部分,使其包含任何同时包含权限的额外插件。
6.2. 设置客户端身份验证供应商 复制链接链接已复制到粘贴板!
您可以启用客户机身份验证,并将其与 RBAC frontend 插件一起使用。
先决条件
-
您已在 Developer Hub 中安装了
@janus-idp/backstage-plugin-rbac插件。如需更多信息,请参阅配置动态插件。
流程
-
在
app-config.yaml文件中,添加用户实体引用来解析和启用dangerouslyAllowOutsideDevelopment选项,如下例所示:
auth:
environment: development
providers:
guest:
userEntityRef: user:default/guest
dangerouslyAllowOutsideDevelopment: true
您可以使用 user:default/guest 作为用户实体引用,以匹配 app-config.yaml 文件的 permission.rbac.admin.users 部分下添加的用户。
第 7 章 权限策略参考 复制链接链接已复制到粘贴板!
Red Hat Developer Hub 中的权限策略是一组规则,用于管理对资源或功能的访问。这些策略基于其角色来说明授予用户的授权级别。实施权限策略,以维护给定环境中的安全性和保密性。
您可以在 Developer Hub 中定义以下类型的权限:
- 资源类型
- 基本的
两种权限类型之间的区别取决于权限是否包含定义的资源类型。
您可以使用关联的资源类型或权限名称来定义资源类型权限,如下例所示:
资源类型权限定义示例
p, role:default/myrole, catalog.entity.read, read, allow
g, user:default/myuser, role:default/myrole
p, role:default/another-role, catalog-entity, read, allow
g, user:default/another-user, role:default/another-role
您可以使用权限名称在 Developer Hub 中定义基本权限,如下例所示:
基本权限定义示例
p, role:default/myrole, catalog.entity.create, create, allow
g, user:default/myuser, role:default/myrole
Developer Hub 支持以下权限策略:
- 目录权限
- .catalog 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
|
| 允许用户或角色从目录中读取 |
|
|
| 允许用户或角色创建目录实体,包括在目录中注册现有组件 | |
|
|
|
| 允许用户或角色从目录中刷新一个或多个实体 |
|
|
|
| 允许用户或角色从目录中删除单个或多个实体 |
|
|
| 允许用户或角色从目录中读取单个或多个位置 | |
|
|
| 允许用户或角色在目录中创建位置 | |
|
|
| 允许用户或角色从目录中删除位置 |
- 批量导入权限
- .bulk 导入权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
|
| 允许用户访问批量导入端点,如列出所有 GitHub 集成可访问的所有存储库和机构,并管理导入请求 |
- Scaffolder 权限
- .Scaffolder 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
|
| 允许从模板执行操作 |
|
|
|
| 允许用户或角色从模板中读取单个或多个参数 |
|
|
|
| 允许用户或角色从模板读取单个或多个步骤 |
|
|
| 允许用户或角色触发软件模板,以创建新的构建程序任务 | |
|
|
| 允许用户或角色取消当前运行的构建程序任务 | |
|
|
| 允许用户或角色读取所有构建器任务及其关联的事件和日志 |
- RBAC 权限
- .RBAC 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
|
| 允许用户或角色读权限策略和角色 |
|
|
|
| 允许用户或角色创建单个或多个权限策略和角色 |
|
|
|
| 允许用户或角色更新单个或多个权限策略和角色 |
|
|
|
| 允许用户或角色删除一个或多个权限策略和角色 |
- Kubernetes 权限
- .Kubernetes 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
| 允许用户或角色访问代理端点 |
- OCM 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
| 允许用户或角色从 OCM 插件读取 | |
|
|
| 允许用户或角色读取 OCM 插件中的集群信息 |
- 拓扑权限
- .topology 权限
| Name | 资源类型 | policy | 描述 |
|---|---|---|---|
|
|
| 允许用户或角色查看拓扑插件 | |
|
|
| 允许用户或角色访问代理端点,允许用户或角色读取 RHDH 中的 pod 日志和事件 |
第 8 章 Red Hat Developer Hub 中的条件策略 复制链接链接已复制到粘贴板!
Red Hat Developer Hub 中的权限框架提供了由 RBAC 后端插件支持的条件(backstage-plugin-rbac-backend)。条件作为 RBAC 后端插件提供的 Developer Hub 资源的内容过滤器。
RBAC 后端 API 存储分配给数据库中的角色的条件。当您请求访问 frontend 资源时,RBAC 后端 API 会搜索对应的条件,并使用其插件 ID 将它们委派给适当的插件。如果您分配到具有不同条件的多个角色,则 RBAC 后端将使用 anyOf 条件合并条件。
- 条件条件条件
Developer Hub 中的条件是带有规则和参数的简单条件。但是,条件也可以包含参数或按条件条件组合的参数数组。支持的条件条件包括:
-
allOf: 确保阵列中的所有条件都必须为 true,才能满足组合条件。 -
anyOf: 确保该阵列中至少需要满足组合条件的条件。 -
Not : 确保其中的条件不能满足组合条件。
-
- 条件对象
该插件指定条件支持的参数。您可以从 RBAC API 端点访问条件对象模式,以了解如何构建条件 JSON 对象,然后由 RBAC 后端插件 API 使用该对象。
条件对象包含以下参数:
Expand 表 8.1. 条件对象参数 参数 类型 描述 result字符串
始终值为
CONDITIONALroleEntityRef字符串
对 RBAC 角色的字符串实体引用,如
role:default/devpluginId字符串
对应的插件 ID,如
目录permissionMapping字符串数组
数组权限操作,如
['read', 'update', 'delete']resourceType字符串
插件提供的资源类型,如
catalog-entityconditionsJSON
带有参数或数组参数的条件 JSON,按条件加入
- 条件策略别名
RBAC 后端插件(
backstage-plugin-rbac-backend)支持在条件策略规则参数中使用别名。在策略评估过程中,条件策略别名会动态地替换为对应的值。条件策略中的每个别名都以$符号作为前缀,代表其特殊功能。支持的条件别名包括:
-
$currentuser:此别名替换为请求访问资源的用户的用户实体引用。例如,如果用户从默认命名空间请求访问,$currentUser将变为user:default/tom。
-
带有 $currentUser 别名的条件策略对象示例
{
"result": "CONDITIONAL",
"roleEntityRef": "role:default/developer",
"pluginId": "catalog",
"resourceType": "catalog-entity",
"permissionMapping": ["delete"],
"conditions": {
"rule": "IS_ENTITY_OWNER",
"resourceType": "catalog-entity",
"params": {
"claims": ["$currentUser"]
}
}
}
-
$ownerRefs:此别名替换为所有权引用,通常是作为包含用户实体引用和用户的父组实体引用的数组。例如,对于来自 team-a 的用户 Tom,$ownerRefs将变为['user:default/tom', 'group:default/team-a']。
带有 $ownerRefs 别名的条件策略对象示例
{
"result": "CONDITIONAL",
"roleEntityRef": "role:default/developer",
"pluginId": "catalog",
"resourceType": "catalog-entity",
"permissionMapping": ["delete"],
"conditions": {
"rule": "IS_ENTITY_OWNER",
"resourceType": "catalog-entity",
"params": {
"claims": ["$ownerRefs"]
}
}
}
8.1. 条件策略参考 复制链接链接已复制到粘贴板!
您可以访问 Red Hat Developer Hub 中条件策略的 API 端点。例如,要检索可用的条件规则,这有助于定义这些策略,您可以访问 GET [api/plugins/condition-rules] 端点。
api/plugins/condition-rules 返回条件参数 schemas,例如:
[
{
"pluginId": "catalog",
"rules": [
{
"name": "HAS_ANNOTATION",
"description": "Allow entities with the specified annotation",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"annotation": {
"type": "string",
"description": "Name of the annotation to match on"
},
"value": {
"type": "string",
"description": "Value of the annotation to match on"
}
},
"required": [
"annotation"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
},
{
"name": "HAS_LABEL",
"description": "Allow entities with the specified label",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Name of the label to match on"
}
},
"required": [
"label"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
},
{
"name": "HAS_METADATA",
"description": "Allow entities with the specified metadata subfield",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Property within the entities metadata to match on"
},
"value": {
"type": "string",
"description": "Value of the given property to match on"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
},
{
"name": "HAS_SPEC",
"description": "Allow entities with the specified spec subfield",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Property within the entities spec to match on"
},
"value": {
"type": "string",
"description": "Value of the given property to match on"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
},
{
"name": "IS_ENTITY_KIND",
"description": "Allow entities matching a specified kind",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"kinds": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of kinds to match at least one of"
}
},
"required": [
"kinds"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
},
{
"name": "IS_ENTITY_OWNER",
"description": "Allow entities owned by a specified claim",
"resourceType": "catalog-entity",
"paramsSchema": {
"type": "object",
"properties": {
"claims": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of claims to match at least one on within ownedBy"
}
},
"required": [
"claims"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
}
]
}
... <another plugin condition parameter schemas>
]
RBAC 后端 API 根据前面的条件模式构造一个条件 JSON 对象。
8.1.1. 条件策略示例 复制链接链接已复制到粘贴板!
在 Red Hat Developer Hub 中,您可以使用或没有条件定义条件策略。您可以使用以下示例根据您的用例定义条件:
- 没有条件的条件
只有用户是所有者组的成员时,请考虑没有条件显示目录的条件。要添加此条件,您可以使用目录插件模式
IS_ENTITY_OWNER,如下所示:没有条件的示例
{ "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }在上例中,唯一使用的条件参数是
claims,其中包含用户或组实体引用的列表。您可以通过添加额外的参数将前面的示例条件应用到 RBAC REST API,如下所示:
{ "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } } }- 具有条件的条件
考虑条件条件,它只有在用户是所有者组成员或显示所有目录用户组的列表时才会显示目录。
要添加条件,您可以在条件中添加另一个规则作为
IS_ENTITY_KIND,如下所示:带有条件的条件示例
{ "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ] }注意不支持在创建过程中运行并行条件。因此,请考虑根据可用的标准定义嵌套条件策略。
嵌套条件示例
{ "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ], "not": { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Api"] } } }您可以通过添加额外的参数将前面的示例条件应用到 RBAC REST API,如下所示:
{ "result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": { "anyOf": [ { "rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": { "claims": ["group:default/team-a"] } }, { "rule": "IS_ENTITY_KIND", "resourceType": "catalog-entity", "params": { "kinds": ["Group"] } } ] } }
以下示例可用于 Developer Hub 插件。这些示例可帮助您确定如何定义条件策略:
为 Keycloak 插件定义的条件策略
{
"result": "CONDITIONAL",
"roleEntityRef": "role:default/developer",
"pluginId": "catalog",
"resourceType": "catalog-entity",
"permissionMapping": ["update", "delete"],
"conditions": {
"not": {
"rule": "HAS_ANNOTATION",
"resourceType": "catalog-entity",
"params": { "annotation": "keycloak.org/realm", "value": "<YOUR_REALM>" }
}
}
}
前面的 Keycloak 插件示例可防止 role:default/developer 中的用户更新或删除在 Keycloak 插件中放入目录的用户。
在上例中,注解 keycloak.org/realm 需要 < YOUR_REALM > 的值。
为 Quay 插件定义的条件策略
{
"result": "CONDITIONAL",
"roleEntityRef": "role:default/developer",
"pluginId": "scaffolder",
"resourceType": "scaffolder-action",
"permissionMapping": ["use"],
"conditions": {
"not": {
"rule": "HAS_ACTION_ID",
"resourceType": "scaffolder-action",
"params": { "actionId": "quay:create-repository" }
}
}
}
前面的 Quay 插件示例可防止角色 role:default/developer 使用 Quay builder 操作。请注意,permissionMapping 包含使用 ,表示 scaffolder-action 资源类型权限没有权限策略。
有关 Red Hat Developer Hub 中权限的更多信息,请参阅 第 7 章 权限策略参考。
第 9 章 Red Hat Developer Hub 中的用户统计信息 复制链接链接已复制到粘贴板!
在 Red Hat Developer Hub 中,licensed-users-info-backend 插件使用 Web UI 或 REST API 端点提供有关已登录用户的统计信息。
licensed-users-info-backend 插件使管理员能够监控 Developer Hub 上的活跃用户数量。使用此功能,组织可以将其实际使用量与他们购买的许可证数量进行比较。另外,您还可以与红帽共享用户指标,以获得透明和准确的许可证。
licensed-users-info-backend 插件被默认启用。此插件在 Administration → RBAC 选项卡的底部启用 Download User List 链接。
9.1. 在 Red Hat Developer Hub 中下载活跃用户列表 复制链接链接已复制到粘贴板!
您可以使用 Developer Hub Web 界面下载 CSV 格式的用户列表。
先决条件
-
Red Hat Developer Hub 中必须启用 RBAC 插件(
@janus-idp/backstage-plugin-rbac和@janus-idp/backstage-plugin-rbac-backend)。 - 必须分配管理员角色。
流程
- 在 Red Hat Developer Hub 中,进入 Administration 并选择 RBAC 选项卡。
- 在 RBAC 页面的底部,单击 Download User List。
- 可选:在 Save as 字段中修改文件名,然后点 保存。
- 要访问下载的用户列表,请访问本地计算机上的 Downloads 文件夹并打开 CSV 文件。