生成数据集

本文档描述了如何使用数据集提供程序及其 API 来生成用于负载测试的数据集。

永远不要在生产环境中安装此提供程序,因为其端点未受到保护。

先决条件

当使用 Quarkus 或 minikube 安装时,所有 URL 都以 /realms/master 开头。对于 Wildfly 发行版,URL 以 /auth/realms/master 开头。

使用数据集提供程序

脚本化用法

此脚本包含下一节中描述的关于 realm、用户和客户端操作的子集。

该脚本假定数据集提供程序已按照 在 minikube 上安装 设置中所述安装,并且可在此处访问:
https://keycloak-keycloak.$(minikube ip).nip.io/realms/master/dataset/.

运行以下命令以接收帮助说明

./dataset-import.sh -a help

您将看到以下选项

Dataset import to the local minikube Keycloak application - usage:
1) create realm/s with clients, users and password hash algorithm & iterations - run -a (action) with or without other arguments: -a create-realms -r 10 -g argon2 -i 5 -c 100 -u 100 -l 'https://keycloak.url.com'
2) create clients in specific realm: -a create-clients -c 100 -n realm-0 -l 'https://keycloak.url.com'
3) create users in specific realm: -a create-users -u 100 -n realm-0 -l 'https://keycloak.url.com'
4) create events in specific realm: -a create-events -e 100 -n realm-0 -l 'https://keycloak.url.com'
5) create offline sessions in specific realm: -a create-offline-sessions -o 100 -n realm-0 -l 'https://keycloak.url.com'
6) delete specific realm/s with prefix -a delete-realms -p realm -l 'https://keycloak.url.com'
7) dataset provider status -a status 'https://keycloak.url.com'
8) dataset provider status check of last completed job -a status-completed -t 10 -l 'https://keycloak.url.com'
9) dataset provider clear status of last completed job -a clear-status-completed -l 'https://keycloak.url.com'
10) dataset import script usage -a help

创建 10 个新 realm 的示例

./dataset-import.sh -a create-realms -r 10

或者,用户也可以从 provision/minikube 模块中运行 Taskfile,以执行 dataset-import 任务,从而无缝地执行 Kubernetes 风格部署的自动化。

dataset-import 任务重用了上面定义的命令行参数,以方便用户使用。请注意将任务名称与传递给脚本的命令行选项分开的两个破折号 (--)。

task dataset-import -- -a create-realms -r 10

要了解有关该工具的更多信息,请参阅 使用工具 task 进行自动化 以获取详细信息。

数据集提供程序 API

创建多个 realm

您需要调用此 HTTP REST 请求。此请求对于创建 10 个 realm 非常有用。每个 realm 将包含指定数量的角色、客户端、组和用户

.../realms/master/dataset/create-realms?count=10

创建多个客户端

这是在 realm realm-5 中创建 100 个新客户端的请求。每个客户端都将启用服务帐户,并且密钥类似于 «client_id»-secret(例如,对于客户端 client-156,密钥为 client-156-secret

.../realms/master/dataset/create-clients?count=200&realm-name=realm-5

您还可以配置访问类型(bearer-onlyconfidentialpublic)以及客户端是否应为服务帐户客户端,使用以下两个参数

...&client-access-type=bearer-only&service-account-client=false

创建多个用户

这是在 realm-5 中创建 500 个新用户的请求。每个用户都将拥有指定数量的角色、客户端角色和组,这些角色、客户端角色和组已由 create-realms 端点创建。每个用户的密码都类似于 «Username»-password。例如,user-156 的密码将类似于 user-156-password

.../realms/master/dataset/create-users?count=1000&realm-name=realm-5

创建多个组

组作为 realm 创建的一部分被创建。可以通过使用以下参数来管理创建的组的数量和结构

groups-per-realm

每个 realm 的组总数。默认值为 20

groups-with-hierarchy

truefalse,默认值为 false。使用默认值,仅创建顶级组。如果将 groups-with-hierarchy 设置为 true,则会创建组的树状结构;树的深度由参数 groups-hierarchy-depth 定义,groups-count-each-level 定义每个创建的组将有多少个子组。

groups-hierarchy-depth

组树状结构的深度。默认值为 3。使用默认值,顶级组将具有 groups-count-each-level 个子组,并且每个子组本身将具有 groups-count-each-level 个子组。此参数仅在 groups-with-hierarchytrue 时有效。

groups-count-each-level

每个创建的组将有多少个子组。此参数仅在 groups-with-hierarchytrue 时有效。

使用默认值时,仅创建顶级组。如果将 groups-with-hierarchy 设置为 true,则会忽略 groups-per-realm 参数,并按照其他参数的定义创建组树结构。groups-count-each-levelgroups-hierarchy-depth 将是创建的组的总数。分层组实现遵循 groups-per-transaction。采用的子组命名约定在组名称中使用点 (.),这允许即使父组是在之前的事务中创建的,也能找到父组。

示例参数
.../realms/master/dataset/create-realms?count=1&groups-with-hierarchy=true&groups-hierarchy-depth=3&groups-count-each-level=50

您还可以通过调用 create-groups 端点并设置 realm-name 参数在现有 realm 中创建组

示例参数
.../realms/master/dataset/create-groups?realm-name=realm-0&count=10&groups-with-hierarchy=true&groups-hierarchy-depth=3&groups-count-each-level=5

创建多个事件

这是在具有前缀 realm- 的可用 realm 中创建 1000 万个新事件的请求。例如,如果我们有 100 个 realm,如 realm-0realm-1、…​ realm-99,它将在其中随机创建 1000 万个事件

.../realms/master/dataset/create-events?count=10000000

创建多个离线会话

这是在具有前缀 realm- 的可用 realm 中创建 1000 万个新离线会话的请求。例如,如果我们有 100 个 realm,如 realm-0realm-1、… realm-99,它将在其中随机创建 1000 万个事件

.../realms/master/dataset/create-offline-sessions?count=10000000

移除多个 realm

移除具有默认 realm 前缀 realm 的所有 realm

.../realms/master/dataset/remove-realms?remove-all=true

您可以使用 realm-prefix 来更改默认 realm 前缀。您可以使用参数来移除所有 realm,例如仅从 foorealm5foorealm15

.../realms/master/dataset/remove-realms?realm-prefix=foorealm&first-to-remove=5&last-to-remove=15

更改默认参数

要更改参数,请查看 DataSetConfig class 以查看可用参数和默认值,以及特定参数适用的端点。例如,要创建前缀为 foo 的 realm,并且仅使用 1000 次哈希迭代(使用默认哈希算法)用于密码策略,您可以使用以下参数

.../realms/master/dataset/create-realms?count=10&realm-prefix=foo&password-hash-iterations=1000

另一个示例是,使用以下参数指定特定的哈希算法以及哈希迭代次数

.../realms/master/dataset/create-realms?count=10&realm-prefix=foo&password-hash-algorithm=argon2&password-hash-iterations=1000

配置在 HTTP 端点被触发时写入服务器日志,因此您可以监控进度以及实际应用的参数。

请注意,新对象的创建将自动从下一个可用索引开始。例如,当您触发上述端点以创建多个客户端,并且您的数据库中已经有 230 个客户端(client-0client-1、.. client-229)时,您的 HTTP 请求将从 client-230 开始创建客户端。

检查任务是否仍在运行

使用 GET 方法调用以下 URL

.../realms/master/dataset/status

如果仍有任务正在运行,它将返回如下信息

{"status":"Task in progress","task-id":{"startTimeMs":"1662115169043","message":"Creation of 1 realms from realm-6 to realm-6"}}

如果没有任务正在运行,它将返回如下信息

{"status":"No task in progress. New task can be started"}

检查上次完成任务的结果

使用 GET 方法调用以下 URL

.../realms/master/dataset/status-completed

如果仍有任务正在运行,它将返回如下信息

{"status":"previous task completed","task":{"success":"true","startTimeMs":"1662115169043","message":"Creation of 1 realms from realm-1 to realm-1","endTimeMs":"1662115173323"}}

如果没有已完成的任务,它将返回此信息,状态码为 404

{"status":"No completed task"}

清除上次完成任务的结果

使用 DELETE 方法调用以下 URL

.../realms/master/dataset/status-completed

检查特定对象的最后条目

查看最后创建的 realm 索引

.../realms/master/dataset/last-realm

查看给定 realm 中最后创建的客户端

.../realms/master/dataset/last-client?realm-name=realm5

查看给定 realm 中最后创建的用户

.../realms/master/dataset/last-user?realm-name=realm5

配置组织

在配置组织之前,请确保手动创建或配置 realm。例如,按如下所示配置 realm-0 realm

.../realms/master/dataset/create-realms?count=1&users-per-realm=5000

结果,您将拥有一个 realm realm-0,其中包含 5k 用户。

这是在具有前缀 org- 的 realm 中创建 1000 个组织的请求

.../realms/realm-0/dataset/orgs/create?count=1000

或者,您可以创建一个具有给定名称的单个组织

realms/realm-0/dataset/orgs/create?name=myorg.com&domains=myorg.com,myorg.org,myorg.net&count=1

您还可以指定每个创建的组织应链接多少成员(托管和非托管)以及多少身份提供程序

.../realms/realm-0/dataset/orgs/create?count=1000&unmanaged-members-count=500&identity-providers-count=10

结果,1k 个组织具有以下配置

  • 500 个非托管成员

  • 10 个身份提供程序

也可以指定每个身份提供程序的身份提供程序映射器的数量

.../realms/realm-0/dataset/orgs/create?count=1000&unmanaged-members-count=500&identity-providers-count=10&identity-provider-mappers-count=3

在这种情况下,1k 个组织,每个组织有 500 个非托管成员,10 个身份提供程序,每个身份提供程序有 3 个身份提供程序映射器

您还可以将数据配置到特定组织。例如,要为特定组织配置更多身份提供程序

.../realms/realm-0/dataset/orgs/org-0/identity-providers/create?count=1000

或者,可以指定每个身份提供程序的身份提供程序映射器的数量

.../realms/realm-0/dataset/orgs/org-0/identity-providers/create?count=1000&identity-provider-mappers-count=5

或为特定组织配置更多非托管成员

.../realms/realm-0/dataset/orgs/org-0/members/create-unmanaged?count=100

或为特定组织配置更多托管成员

.../realms/realm-0/dataset/orgs/org-0/members/create-managed?count=100

在配置成员时,请确保您已在 realm 中创建了足够的用户。对于托管成员,您还需要至少一个链接到组织的身份提供程序。

如果要移除组织

.../realms/realm-0/dataset/orgs/org-0/remove

延伸阅读