使用 Keycloak Admin Client
Quarkus Keycloak Admin Client 及其响应式版本支持 Keycloak Admin Client,可用于配置正在运行的 Keycloak 服务器。
本指南演示了如何利用 Quarkus ArC 将 admin client 注入到您的 Quarkus 应用程序中,以及如何在应用程序代码中直接创建它。
要了解更多关于 Keycloak Admin Client 的信息,请参阅其 参考指南。
先决条件
要完成本指南,您需要
-
大约 15 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
一个正常工作的容器运行时(Docker 或 Podman)
-
如果您想使用它,可以选择 Quarkus CLI
-
如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置
创建项目
首先,我们需要一个新项目。使用以下命令创建一个新项目
对于 Windows 用户
-
如果使用 cmd,(不要使用反斜杠
\
并将所有内容放在同一行上) -
如果使用 Powershell,请将
-D
参数括在双引号中,例如"-DprojectArtifactId=security-keycloak-admin-client"
此命令将生成一个导入 keycloak-admin-rest-client
和 rest-jackson
扩展的 Quarkus 项目。
如果您已经配置了 Quarkus 项目,可以通过在项目根目录中运行以下命令,将 keycloak-admin-rest-client
和 rest-jackson
扩展添加到您的项目中:
quarkus extension add keycloak-admin-rest-client,rest-jackson
./mvnw quarkus:add-extension -Dextensions='keycloak-admin-rest-client,rest-jackson'
./gradlew addExtension --extensions='keycloak-admin-rest-client,rest-jackson'
这会将以下内容添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-keycloak-admin-rest-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-jackson</artifactId>
</dependency>
implementation("io.quarkus:quarkus-keycloak-admin-rest-client")
implementation("io.quarkus:quarkus-rest-jackson")
我们还需要一个简单的资源,其中 Keycloak
被注入为请求范围的 CDI bean。
package org.acme.keycloak.admin.client;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.representations.idm.RoleRepresentation;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;
@Path("/api/admin")
public class RolesResource {
@Inject
Keycloak keycloak; (1)
@GET
@Path("/roles")
public List<RoleRepresentation> getRoles() {
return keycloak.realm("quarkus").roles().list();
}
}
1 | 创建一个默认的 Keycloak Admin Client,它可以作为 admin-cli 客户端执行 Keycloak master realm 的管理任务,例如添加新的 realm、client 和 user。 |
创建此 Keycloak Admin Client 所需的唯一配置是 Keycloak 服务器 URL。
例如
# Quarkus based Keycloak distribution
quarkus.keycloak.admin-client.server-url=https://:8081
或
# WildFly based Keycloak distribution
quarkus.keycloak.admin-client.server-url=https://:8081/auth
如果您希望注入 |
将 Keycloak Admin Client 注入而不是直接在应用程序代码中创建它是一个更简单、更灵活的选择,但如有必要,您也可以手动创建相同的 admin client。
package org.acme.keycloak.admin.client;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.representations.idm.RoleRepresentation;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;
@Path("/api/admin")
public class RolesResource {
Keycloak keycloak;
@PostConstruct
public void initKeycloak() {
keycloak = KeycloakBuilder.builder()
.serverUrl("https://:8081")
.realm("master")
.clientId("admin-cli")
.grantType("password")
.username("admin")
.password("admin")
.build();
}
@PreDestroy
public void closeKeycloak() {
keycloak.close();
}
@GET
@Path("/roles")
public List<RoleRepresentation> getRoles() {
return keycloak.realm("quarkus").roles().list();
}
}
有关更多详细信息,请参阅 Keycloak Admin REST API 文档。
您可以配置 Keycloak Admin Client 来管理其他 realm 和 client。它可以利用 password
或 client_credentials
授权类型来获取访问令牌,以调用需要授权的 Admin REST API。
如果您使用用户凭据交换访问令牌,以下是 password
授权类型的示例配置:
quarkus.keycloak.admin-client.server-url=https://:8081
quarkus.keycloak.admin-client.realm=quarkus
quarkus.keycloak.admin-client.client-id=quarkus-client
quarkus.keycloak.admin-client.username=alice
quarkus.keycloak.admin-client.password=alice
quarkus.keycloak.admin-client.grant-type=PASSWORD (1)
1 | 使用 password 授权类型。 |
使用 client-credentials
授权类型的示例只需要进行微调。
quarkus.keycloak.admin-client.enabled=true
quarkus.keycloak.admin-client.server-url=https://:8081
quarkus.keycloak.admin-client.realm=quarkus
quarkus.keycloak.admin-client.client-id=quarkus-client
quarkus.keycloak.admin-client.client-secret=secret
quarkus.keycloak.admin-client.username= # remove default username
quarkus.keycloak.admin-client.password= # remove default password
quarkus.keycloak.admin-client.grant-type=CLIENT_CREDENTIALS (1)
1 | 使用 client_credentials 授权类型。 |
请注意,OidcClient 也可用于获取令牌。 |
配置 TLS
要为 Keycloak Admin Client 配置 TLS 连接,请使用 TLS Registry 扩展并将 Keycloak Admin Client 指向相应的 TLS 配置。例如,您可以这样配置双向 TLS (mTLS):
quarkus.keycloak.admin-client.tls-configuration-name=kc-mtls
quarkus.tls.kc-mtls.key-store.p12.path=client-keystore.p12
quarkus.tls.kc-mtls.key-store.p12.password=secret
quarkus.tls.kc-mtls.trust-store.p12.path=client-truststore.p12
quarkus.tls.kc-mtls.trust-store.p12.password=secret
测试
在 Keycloak Admin Client 的测试中,使用 Dev Services for Keycloak 是首选方法。Dev Services for Keycloak
将启动并初始化一个测试容器。然后,它将创建一个 quarkus
realm 和一个 quarkus-app
client(secret
密钥),并添加 alice
(admin
和 user
角色)和 bob
(user
角色)用户,所有这些属性都可以自定义。
例如,默认情况下,测试容器将在一个随机分配的端口上可用,但您可以像下面这样让 Keycloak Admin Client 和容器使用相同的端口:
%test.quarkus.keycloak.devservices.port=${kc.admin.port.test:45180} (1)
%test.quarkus.keycloak.admin-client.server-url=https://:${kc.admin.port.test:45180}/ (2)
1 | 默认配置 Keycloak 容器监听 45180 端口 |
2 | 配置 Keycloak Admin Client 使用相同的端口 |
Quarkus Keycloak Admin Client 配置参考
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
如果支持 Keycloak Admin Client 注入,则设置为 true。 环境变量: 显示更多 |
布尔值 |
|
Keycloak 服务器 URL,例如 环境变量: 显示更多 |
字符串 |
|
字符串 |
|
|
Client id。 环境变量: 显示更多 |
字符串 |
|
Client secret。使用 环境变量: 显示更多 |
字符串 |
|
Username。使用 环境变量: 显示更多 |
字符串 |
|
Password。使用 环境变量: 显示更多 |
字符串 |
|
字符串 |
||
OAuth Grant Type。 环境变量: 显示更多 |
|
|
要使用的 TLS 配置的名称。 如果配置了名称,它将使用来自 默认情况下,不使用默认 TLS 配置。 环境变量: 显示更多 |
字符串 |