授权


Red Hat Developer Hub 1.4

在 Red Hat Developer Hub 中使用基于角色的访问控制(RBAC)配置授权

Red Hat Customer Content Services

摘要

Red Hat Developer Hub 管理员可以使用基于角色的访问控制(RBAC)来管理其他用户的授权。

前言

管理员可以授权用户执行操作,并定义用户在 Developer Hub 中执行的操作。

基于角色的访问控制(RBAC)是一种安全概念,通过指定系统用户与系统中资源可以执行的操作之间的映射来定义如何控制对系统中的资源的访问。您可以使用 RBAC 定义具有特定权限的角色,然后将角色分配给用户和组。

Developer Hub 上的 RBAC 基于 Permissions 框架构建,该框架在代码中定义 RBAC 策略。您可以使用 Developer Hub RBAC 功能在代码中定义策略,而不是使用基于 CSV 的简单格式以声明方式定义策略。您可以使用 Developer Hub Web 界面或 REST API 来定义策略,而不是直接编辑 CSV。

管理员可以执行以下步骤在 Developer Hub 中定义授权:

  1. 启用 RBAC 功能,并授予授权用户对该功能的访问权限。
  2. 通过组合以下方法来定义角色和策略:

    • Developer Hub 策略管理员使用 Developer Hub Web 界面或 REST API。
    • Developer Hub 管理员编辑主 Developer Hub 配置文件。
    • Developer Hub 管理员编辑外部文件。

基于角色的访问控制(RBAC)功能默认为禁用。启用 RBAC 插件并声明策略管理员以使用 RBAC 功能启动。

Developer Hub 中用户和组的权限策略由权限策略管理员管理。只有权限策略管理员才能访问基于角色的访问控制 REST API。

先决条件

流程

  1. RBAC 插件已安装,但默认禁用。要启用 ./dynamic-plugins/dist/backstage-community-plugin-rbac 插件,请使用以下内容编辑 dynamic-plugins.yaml

    dynamic-plugins.yaml 片段

    plugins:
      - package: ./dynamic-plugins/dist/backstage-community-plugin-rbac
        disabled: false
    Copy to Clipboard Toggle word wrap

    请参阅 Red Hat Developer Hub 中安装和查看插件

  2. 声明策略管理员,以启用选择数量的经过身份验证的用户,以通过 REST API 或 Web UI 配置 RBAC 策略,而不是直接修改 CSV 文件。权限可以在 my-rhdh-app-config 配置映射中引用的单独 CSV 文件中指定,也可以使用 REST API 或 Web UI 创建权限。

    要将 < your_policy_administrator_name&gt; 等用户声明为策略管理员,请编辑自定义 Developer Hub ConfigMap,如 app-config-rhdh,并将以下代码添加到 app-config.yaml 内容中:

    app-config.yaml 片段

    permission:
      enabled: true
      rbac:
        admin:
          users:
            - name: user:default/<your_policy_administrator_name>
    Copy to Clipboard Toggle word wrap

  3. 要让 Developer Hub Web UI 显示安装插件提供的可用权限,请将对应的插件 ID 添加到 自定义 app-config.yaml Developer Hub 配置文件 中。

    要在 RBAC UI 中显示可用权限,请编辑自定义 Developer Hub ConfigMap,如 app-config-rhdh,并将以下代码添加到 app-config.yaml 内容中:

    app-config.yaml 片段

    permission:
      enabled: true
      rbac:
        admin:
          users:
            - name: user:default/<your_policy_administrator_name>
        pluginsWithPermission:
          - catalog
          - scaffolder
          - permission
    Copy to Clipboard Toggle word wrap

验证

  1. 从现有的 Red Hat Developer Hub 会话注销,并使用声明的策略管理员帐户再次登录。
  2. 启用 RBAC 后,大多数功能都会默认禁用。

    1. 导航到 RHDH 中的 Catalog 页面。Create 按钮不可见。您无法创建新组件。
    2. 导航到 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 请求。

策略管理员可以使用 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 中创建角色。

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 单击 CREATE 以创建角色。
  4. 在给定字段中输入角色的名称和描述,然后单击 NEXT
  5. 使用搜索字段添加用户和组,然后单击 NEXT
  6. Add permission policies 部分中的下拉列表中,选择 PluginPermission
  7. 选择或清除您要在 Add permissions policies 部分中设置的 Policy,然后单击 NEXT
  8. 查看 Review and create 部分中的添加的信息。
  9. CREATE

验证

创建的角色会出现在 RBAC 选项卡中可用的列表中。

3.2. 在 Red Hat Developer Hub Web UI 中编辑角色

您可以使用 Web UI 在 Red Hat Developer Hub 中编辑角色。

注意

policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 选择您要编辑的角色的编辑图标。
  4. 编辑角色的详细信息,如名称、描述、用户和组以及权限策略,然后单击 NEXT
  5. 检查角色的编辑详细信息,然后单击 SAVE

编辑角色后,您可以查看角色的 OVERVIEW 页面上 角色的 编辑详情。您还可以使用 OVERVIEW 页面中的编辑图标来编辑角色的用户和组或权限。

3.3. 删除 Red Hat Developer Hub Web UI 中的角色

您可以使用 Web UI 删除 Red Hat Developer Hub 中的角色。

注意

policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。

先决条件

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 从您要删除的角色的 Actions 列中选择 delete 图标。

    删除此角色? 弹出会出现在屏幕上。

  4. 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 请求。

流程

  1. 查找 Bearer 令牌以向 REST API 进行身份验证。

    1. 在您的浏览器中,打开 Web 控制台 网络 选项卡。
    2. 在主屏幕中,重新载入 Developer Hub Homepage
    3. 在 Web 控制台 网络 选项卡中,搜索 query?term= 网络调用。
    4. 令牌 保存到响应 JSON 中,以获取后续步骤。
  2. 在终端中运行 curl 命令并查看响应:

    GETDELETE 请求

    curl -v \
      -H "Authorization: Bearer <token>" \
      -X <method> "https://<my_developer_hub_url>/<endpoint>" \
    Copy to Clipboard Toggle word wrap

    需要 JSON 正文数据的 POSTPUT 请求

    curl -v -H "Content-Type: application/json" \
      -H "Authorization: Bearer <token>" \
      -X POST "https://<my_developer_hub_url>/<endpoint>" \
      -d <body>
    Copy to Clipboard Toggle word wrap

    <token>
    输入您保存的授权令牌。
    <method>

    输入 API 端点 的 HTTP 方法。

    • GET :从指定资源端点检索指定的信息。
    • POST :要创建或更新资源。
    • PUT :更新资源。
    • DELETE :删除资源。
    https://<my_developer_hub_url>
    输入您的 Developer Hub URL。
    <endpoint>
    输入您要发送请求的 API 端点,如 /api/permission/policies
    <body>
    输入带有 API 端点 可能需要的数据的 JSON 正文,以及 HTTP POSTPUT 请求。

    创建角色的请求示例

    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" }
        }'
    Copy to Clipboard Toggle word wrap

    更新角色的请求示例

    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"
              }
            }'
    Copy to Clipboard Toggle word wrap

    创建权限策略的请求示例

    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"
        }]'
    Copy to Clipboard Toggle word wrap

    更新权限策略的请求示例

    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"
                 }
               ]
           }'
    Copy to Clipboard Toggle word wrap

    创建条件的请求示例

    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"]}
          }
        }'
    Copy to Clipboard Toggle word wrap

    更新条件的请求示例

    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"]}
              }
           }'
    Copy to Clipboard Toggle word wrap

验证

  • 查看返回的 HTTP 状态代码:

    200 OK
    请求成功。
    201 created
    请求会导致成功创建新资源。
    204 无内容
    请求成功,响应有效负载没有更多内容。
    400 错误请求
    输入错误以及请求。
    401 未授权
    缺少请求资源的有效身份验证。
    403 Forbidden
    退款以授权请求。
    404 not Found
    无法找到所请求的资源。
    409 冲突
    请求与当前状态和目标资源冲突。

4.2. 使用 REST 客户端将请求发送到 RBAC REST API

您可以使用任何 REST 客户端发送 RBAC REST API 请求。

流程

  1. 查找 Bearer 令牌以向 REST API 进行身份验证。

    1. 在您的浏览器中,打开 Web 控制台 网络 选项卡。
    2. 在主屏幕中,重新载入 Developer Hub Homepage
    3. 在 Web 控制台 网络 选项卡中,搜索 query?term= 网络调用。
    4. 令牌 保存到响应 JSON 中,以获取后续步骤。
  2. 在 REST 客户端中,使用以下参数运行命令并查看响应:

    授权
    输入您保存的授权令牌。
    HTTP 方法

    输入 API 端点 的 HTTP 方法。

    • GET :从指定资源端点检索指定的信息。
    • POST :要创建或更新资源。
    • PUT :更新资源。
    • DELETE :删除资源。
    URL
    输入您的 Developer Hub URL 和 API 端点: https:// <my_developer_hub_url> / &lt;endpoint&gt;,如 https://<my_developer_hub_url&gt; /api/permission/policies
    Body
    输入 JSON 正文,其中包含您的 API 端点 可能需要 的数据

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"
  }
]
Copy to Clipboard Toggle word wrap

[GET] /api/permission/roles/<kind>/<namespace>/<name>

返回 Developer Hub 中单个角色的信息。

响应示例(JSON)

[
  {
    "memberReferences": [
      "group:default/groupname",
      "user:default/username"
    ],
    "name": "role:default/rbac_admin"
  }
]
Copy to Clipboard Toggle word wrap

[POST] /api/permission/roles/<kind>/<namespace>/<name>

在 Developer Hub 中创建角色。

Expand
表 4.1. 请求参数
名称描述类型存在

正文(body)

memberReferencesnamespace 并将新角色命名为要创建的新角色。

请求正文

必填

请求正文示例(JSON)

{
  "memberReferences": ["group:default/test"],
  "name": "role:default/test_admin"
}
Copy to Clipboard Toggle word wrap

响应示例

201 Created
Copy to Clipboard Toggle word wrap

[PUT] /api/permission/roles/ <kind> / &lt;namespace> / &lt;name>

为 Developer Hub 中的角色更新 memberReferences、类型、namespacename

请求参数

请求正文包含 oldRolenewRole 对象:

Expand
Name描述类型存在

正文(body)

memberReferencesnamespace 并将新角色命名为要创建的新角色。

请求正文

必填

请求正文示例(JSON)

{
  "oldRole": {
    "memberReferences": ["group:default/test"],
    "name": "role:default/test_admin"
  },
  "newRole": {
    "memberReferences": ["group:default/test", "user:default/test2"],
    "name": "role:default/test_admin"
  }
}
Copy to Clipboard Toggle word wrap

响应示例

200 OK
Copy to Clipboard Toggle word wrap

[DELETE] /api/permission/roles/<kind>/<namespace>/<name>?memberReferences=<VALUE>

从 Developer Hub 中的角色中删除指定的用户或组。

Expand
表 4.2. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

名称

实体的名称

字符串

必填

memberReferences

关联的组信息

字符串

必填

响应示例

204
Copy to Clipboard Toggle word wrap

[DELETE] /api/permission/roles/<kind>/<namespace>/<name>

从 Developer Hub 删除指定的角色。

Expand
表 4.3. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

名称

实体的名称

字符串

必填

响应示例

204
Copy to Clipboard Toggle word wrap

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"
    }
  },
]
Copy to Clipboard Toggle word wrap

[GET] /api/permission/policies/<kind>/<namespace>/<name>

返回与指定实体引用相关的权限策略。

Expand
表 4.4. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

名称

与实体相关的名称

字符串

必填

响应示例(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"
    }
  }
]
Copy to Clipboard Toggle word wrap

[POST] /api/permission/policies

为指定实体创建权限策略。

Expand
表 4.5. 请求参数
名称描述类型存在

entityReference

实体的引用值,包括 类型namespacename

字符串

必填

权限

特定插件、资源类型或名称的权限

字符串

必填

policy

权限的策略操作,如创建、读取更新删除 或使用

字符串

必填

effect

表示允许或不允许策略

字符串

必填

请求正文示例(JSON)

[
  {
    "entityReference": "role:default/test",
    "permission": "catalog-entity",
    "policy": "read",
    "effect": "allow"
  }
]
Copy to Clipboard Toggle word wrap

响应示例

201 Created
Copy to Clipboard Toggle word wrap

[PUT] /api/permission/policies/<kind>/<namespace>/<name>

更新指定实体的权限策略。

请求参数

请求正文包含 oldPolicynewPolicy 对象:

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"
    }
  ]
}
Copy to Clipboard Toggle word wrap

响应示例

200
Copy to Clipboard Toggle word wrap

[DELETE] /api/permission/policies/ <kind> / <namespace> / <name > ?permission={value1}&policy={value2}&effect={value3}

删除添加到指定实体的权限策略。

Expand
表 4.6. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

名称

与实体相关的名称

字符串

必填

权限

特定插件、资源类型或名称的权限

字符串

必填

policy

权限的策略操作,如创建、读取更新删除 或使用

字符串

必填

effect

表示允许或不允许策略

字符串

必填

响应示例

204 No Content
Copy to Clipboard Toggle word wrap

[DELETE] /api/permission/policies/<kind>/<namespace>/<name>

删除添加到指定实体的所有权限策略。

Expand
表 4.7. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

名称

与实体相关的名称

字符串

必填

响应示例

204 No Content
Copy to Clipboard Toggle word wrap

[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"
      }
    ]
  },
  ...
]
Copy to Clipboard Toggle word wrap

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>
]
Copy to Clipboard Toggle word wrap

[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"]
        }
      }
    ]
  }
}
Copy to Clipboard Toggle word wrap

[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"]
          }
        }
      ]
    }
  }
]
Copy to Clipboard Toggle word wrap

[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

必填

名称

角色的名称

字符串

必填

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"]
    }
  }
}
Copy to Clipboard Toggle word wrap

响应示例(JSON)

{
  "id": 1
}
Copy to Clipboard Toggle word wrap

[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

必填

名称

角色的名称

字符串

必填

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"]
        }
      }
    ]
  }
}
Copy to Clipboard Toggle word wrap

响应示例

200
Copy to Clipboard Toggle word wrap

[DELETE] /api/permission/roles/conditions/:id

删除指定 ID 的条件策略。

响应示例

204
Copy to Clipboard Toggle word wrap

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"
Copy to Clipboard Toggle word wrap

响应示例

{ "quantity": "2" }
Copy to Clipboard Toggle word wrap

[GET] /users

返回登录的用户列表及其详情。

请求示例

curl -X GET "http://localhost:7007/api/licensed-users-info/users" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $token"
Copy to Clipboard Toggle word wrap

响应示例

[
  {
    "userEntityRef": "user:default/dev",
    "lastTimeLogin": "Thu, 22 Aug 2024 16:27:41 GMT",
    "displayName": "John Leavy",
    "email": "dev@redhat.com"
  }
]
Copy to Clipboard Toggle word wrap

[GET] /users

返回 CSV 格式的登录用户列表。

请求示例

curl -X GET "http://localhost:7007/api/licensed-users-info/users" \
-H "Content-Type: text/csv" \
-H "Authorization: Bearer $token"
Copy to Clipboard Toggle word wrap

响应示例

userEntityRef,displayName,email,lastTimeLogin
user:default/dev,John Leavy,dev@redhat.com,"Thu, 22 Aug 2024 16:27:41 GMT"
Copy to Clipboard Toggle word wrap

第 5 章 使用外部文件管理授权

要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中配置权限和角色。

5.1. 使用 Operator 在外部文件中定义授权

要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中定义权限和角色。您需要准备文件,将其上传到 OpenShift Container Platform 项目中,并将 Developer Hub 配置为使用外部文件。

流程

  1. 使用以下格式在 rbac-policies.csv CSV 文件中定义您的策略:

    1. 定义角色权限:

      p, <role_entity_reference>, <permission>, <action>, <allow_or_deny>
      Copy to Clipboard Toggle word wrap
      <role_entity_reference>
      角色实体引用,例如: role:default/guest
      <permission>

      权限,如: bulk.importcatalog.entity.readcatalog.entity.refresh,或权限资源类型,如 bulk-importcatalog-entity

      请参阅: 权限策略参考

      <action>
      操作类型,例如: 使用读取创建更新删除
      <allow_or_deny>
      授予访问权限: 允许或拒绝 .
    2. 为组或用户分配角色:

      g, <group_or_user>, <role_entity_reference>
      Copy to Clipboard Toggle word wrap
      <group_or_user>

      组,如 user:default/mygroup 或 user,例如: user:default/myuser

      Sample rbac-policies.csv

      p, 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
      Copy to Clipboard Toggle word wrap

  2. 使用以下格式在 rbac-conditional-policies.yaml YAML 文件中定义条件策略:

    result: CONDITIONAL
    roleEntityRef: <role_entity_reference>
    pluginId: <plugin_id>
    permissionMapping:
      - read
      - update
      - delete
    conditions: <conditions>
    Copy to Clipboard Toggle word wrap

    请参阅: 条件策略参考

  3. rbac-policies.csvrbac-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
    Copy to Clipboard Toggle word wrap
  4. 更新 Backstage 自定义资源,以挂载来自 rbac-policies 配置映射的 Developer Hub 文件系统:

    Backstage 自定义资源片段

    apiVersion: rhdh.redhat.com/v1alpha3
    kind: Backstage
    spec:
      application:
        extraFiles:
          mountPath: /opt/app-root/src
          configMaps:
            - name: rbac-policies
    Copy to Clipboard Toggle word wrap

  5. 更新 Developer Hub app-config.yaml 配置文件,以使用 rbac-policies.csvrbac-conditional-policies.yaml 外部文件:

    app-config.yaml 文件片段

    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
    Copy to Clipboard Toggle word wrap

5.2. 使用 Helm 在外部文件中定义授权

要自动化 Red Hat Developer Hub 维护,您可以在启动 Developer Hub 前在外部文件中定义权限和角色。您需要准备文件,将其上传到 OpenShift Container Platform 项目中,并将 Developer Hub 配置为使用外部文件。

流程

  1. 使用以下格式在 rbac-policies.csv CSV 文件中定义您的策略:

    1. 定义角色权限:

      p, <role_entity_reference>, <permission>, <action>, <allow_or_deny>
      Copy to Clipboard Toggle word wrap
      <role_entity_reference>
      角色实体引用,例如: role:default/guest
      <permission>

      权限,如: bulk.importcatalog.entity.readcatalog.entity.refresh,或权限资源类型,如 bulk-importcatalog-entity

      请参阅: 权限策略参考

      <action>
      操作类型,例如: 使用读取创建更新删除
      <allow_or_deny>
      授予访问权限: 允许或拒绝 .
    2. 为组或用户分配角色:

      g, <group_or_user>, <role_entity_reference>
      Copy to Clipboard Toggle word wrap
      <group_or_user>

      组,如 user:default/mygroup 或 user,例如: user:default/myuser

      Sample rbac-policies.csv

      p, 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
      Copy to Clipboard Toggle word wrap

  2. 使用以下格式在 rbac-conditional-policies.yaml YAML 文件中定义条件策略:

    result: CONDITIONAL
    roleEntityRef: <role_entity_reference>
    pluginId: <plugin_id>
    permissionMapping:
      - read
      - update
      - delete
    conditions: <conditions>
    Copy to Clipboard Toggle word wrap

    请参阅: 条件策略参考

  3. rbac-policies.csvrbac-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
    Copy to Clipboard Toggle word wrap
  4. 更新 Developer Hub Backstage Helm Chart,以挂载到 rbac-policies 配置映射中的 Developer Hub 文件系统:

    1. 在 Developer Hub Helm Chart 中,进入 Root Schema → Backstage chart schema → Backstage parameters → Backstage container additional volume mount
    2. 选择 Add Backstage 容器附加卷挂载 并添加以下值:

      mountPath
      /opt/app-root/src/rbac
      Name
      rbac-policies
    3. 将 RBAC 策略添加到 Developer Hub Helm Chart 中的 Backstage 容器 附加卷:

      名称
      rbac-policies
      configMap
      defaultMode
      420
      名称
      rbac-policies
  5. 更新 Developer Hub app-config.yaml 配置文件,以使用 rbac-policies.csvrbac-conditional-policies.yaml 外部文件:

    app-config.yaml 文件片段

    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
    Copy to Clipboard Toggle word wrap

第 6 章 使用 RBAC UI 配置客户机访问

使用带有基于角色的访问控制(RBAC)前端插件的客户机访问权限,允许用户测试角色和策略创建,而无需设置和配置身份验证供应商。

注意

不建议在生产环境中使用客户机访问。

6.1. 配置 RBAC 后端插件

您可以通过更新 app-config.yaml 文件来启用权限框架来配置 RBAC 后端插件。

先决条件

流程

  • 更新 app-config.yaml 文件,以启用权限框架,如下所示:
permission
  enabled: true
  rbac:
    admin:
      users:
        - name: user:default/guest
    pluginsWithPermission:
      - catalog
      - permission
      - scaffolder
Copy to Clipboard Toggle word wrap
注意

app-config.yaml 文件的 pluginsWithPermission 部分默认只包含三个插件。根据需要更新 部分,使其包含任何同时包含权限的额外插件。

6.2. 设置客户端身份验证供应商

您可以启用客户机身份验证,并将其与 RBAC frontend 插件一起使用。

先决条件

流程

  • app-config.yaml 文件中,添加用户实体引用来解析和启用 dangerouslyAllowOutsideDevelopment 选项,如下例所示:
auth:
  environment: development
  providers:
    guest:
      userEntityRef: user:default/guest
      dangerouslyAllowOutsideDevelopment: true
Copy to Clipboard Toggle word wrap
注意

您可以使用 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
Copy to Clipboard Toggle word wrap

您可以使用权限名称在 Developer Hub 中定义基本权限,如下例所示:

基本权限定义示例

p, role:default/myrole, catalog.entity.create, create, allow
g, user:default/myuser, role:default/myrole
Copy to Clipboard Toggle word wrap

Developer Hub 支持以下权限策略:

目录权限
.catalog 权限
Expand
Name资源类型policy描述

catalog.entity.read

catalog-entity

读取

允许用户或角色从目录中读取

catalog.entity.create

 

create

允许用户或角色创建目录实体,包括在目录中注册现有组件

catalog.entity.refresh

catalog-entity

update

允许用户或角色从目录中刷新一个或多个实体

catalog.entity.delete

catalog-entity

delete

允许用户或角色从目录中删除单个或多个实体

catalog.location.read

 

读取

允许用户或角色从目录中读取单个或多个位置

catalog.location.create

 

create

允许用户或角色在目录中创建位置

catalog.location.delete

 

delete

允许用户或角色从目录中删除位置

批量导入权限
.bulk 导入权限
Expand
Name资源类型policy描述

bulk.import

bulk-import

use

允许用户访问批量导入端点,如列出所有 GitHub 集成可访问的所有存储库和机构,并管理导入请求

Scaffolder 权限
.Scaffolder 权限
Expand
Name资源类型policy描述

scaffolder.action.execute

scaffolder-action

use

允许从模板执行操作

scaffolder.template.parameter.read

scaffolder-template

读取

允许用户或角色从模板中读取单个或多个参数

scaffolder.template.step.read

scaffolder-template

读取

允许用户或角色从模板读取单个或多个步骤

scaffolder.task.create

 

create

允许用户或角色触发软件模板,以创建新的构建程序任务

scaffolder.task.cancel

 

use

允许用户或角色取消当前运行的构建程序任务

scaffolder.task.read

 

读取

允许用户或角色读取所有构建器任务及其关联的事件和日志

RBAC 权限
.RBAC 权限
Expand
Name资源类型policy描述

policy.entity.read

policy-entity

读取

允许用户或角色读权限策略和角色

policy.entity.create

policy-entity

create

允许用户或角色创建单个或多个权限策略和角色

policy.entity.update

policy-entity

update

允许用户或角色更新单个或多个权限策略和角色

policy.entity.delete

policy-entity

delete

允许用户或角色删除一个或多个权限策略和角色

Kubernetes 权限
.Kubernetes 权限
Expand
Name资源类型policy描述

kubernetes.proxy

 

use

允许用户或角色访问代理端点

OCM 权限
基本 OCM 权限只限制对集群视图的访问,但它们不会阻止访问资源视图中的 Kubernetes 集群。要获得更有效的权限,请考虑应用条件策略来限制对类型为 kubernetes-cluster 的目录实体的访问。访问限制取决于授予角色的权限集合。例如,如果角色具有完整权限(读取updatedelete),则必须在 permissionMapping 字段中指定其所有权限。

permissionMapping 定义示例

result: CONDITIONAL
roleEntityRef: 'role:default/<YOUR_ROLE>'
pluginId: catalog
resourceType: catalog-entity
permissionMapping:
  - read
  - update
  - delete
conditions:
  not:
    rule: HAS_SPEC
    resourceType: catalog-entity
    params:
      key: type
      value: kubernetes-cluster
Copy to Clipboard Toggle word wrap

Expand
Name资源类型policy描述

ocm.entity.read

 

读取

允许用户或角色从 OCM 插件读取

ocm.cluster.read

 

读取

允许用户或角色读取 OCM 插件中的集群信息

拓扑权限
.topology 权限
Expand
Name资源类型policy描述

topology.view.read

 

读取

允许用户或角色查看拓扑插件

kubernetes.proxy

 

use

允许用户或角色访问代理端点,允许用户或角色读取 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

字符串

始终值为 CONDITIONAL

roleEntityRef

字符串

对 RBAC 角色的字符串实体引用,如 role:default/dev

pluginId

字符串

对应的插件 ID,如 目录

permissionMapping

字符串数组

数组权限操作,如 ['read', 'update', 'delete']

resourceType

字符串

插件提供的资源类型,如 catalog-entity

conditions

JSON

带有参数或数组参数的条件 JSON,按条件加入

条件策略别名

RBAC 后端插件(backstage-plugin-rbac-backend)支持在条件策略规则参数中使用别名。在策略评估过程中,条件策略别名会动态地替换为对应的值。条件策略中的每个别名都以 $ 符号作为前缀,代表其特殊功能。

支持的条件别名包括:

  • $current user:此别名替换为请求访问资源的用户的用户实体引用。例如,如果用户从默认命名空间请求访问,$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"]
    }
  }
}
Copy to Clipboard Toggle word wrap

  • $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"]
    }
  }
}
Copy to Clipboard Toggle word wrap

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>
]
Copy to Clipboard Toggle word wrap

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"]
  }
}
Copy to Clipboard Toggle word wrap

在上例中,唯一使用的条件参数是 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"]
    }
  }
}
Copy to Clipboard Toggle word wrap
具有条件的条件

考虑条件条件,它只有在用户是所有者组成员或显示所有目录用户组的列表时才会显示目录。

要添加条件,您可以在条件中添加另一个规则作为 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"]
      }
    }
  ]
}
Copy to Clipboard Toggle word wrap

注意

不支持在创建过程中运行并行条件。因此,请考虑根据可用的标准定义嵌套条件策略。

嵌套条件示例

{
  "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"] }
  }
}
Copy to Clipboard Toggle word wrap

您可以通过添加额外的参数将前面的示例条件应用到 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"]
        }
      }
    ]
  }
}
Copy to Clipboard Toggle word wrap

以下示例可用于 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>" }
    }
  }
}
Copy to Clipboard Toggle word wrap

前面的 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" }
    }
  }
}
Copy to Clipboard Toggle word wrap

前面的 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 插件( @backstage-community/plugin-rbac -community/plugin-rbac-backend)。
  • 必须分配管理员角色。

流程

  1. 在 Red Hat Developer Hub 中,进入 Administration 并选择 RBAC 选项卡。
  2. RBAC 页面的底部,单击 Download User List
  3. 可选:在 Save as 字段中修改文件名,然后点 保存
  4. 要访问下载的用户列表,请访问本地计算机上的 Downloads 文件夹并打开 CSV 文件。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部