5.10. 静态租户配置解析
当您在 application.properties 文件中设置多个租户配置时,您只需要指定租户标识符的解析方式。要配置租户标识符的解析,请使用以下选项之一:
这些租户解析选项会按照列出的顺序尝试,直到租户 id 被解决为止。如果租户 id 仍然未解析(null),则会选择默认(未命名)租户配置。
5.10.1. 使用 TenantResolver解析 复制链接链接已复制到粘贴板!
以下 application.properties 示例演示了如何使用 TenantResolver 方法解析名为 a 和 b 的两个租户的租户标识符:
# Tenant 'a' configuration
quarkus.oidc.a.auth-server-url=http://localhost:8180/realms/quarkus-a
quarkus.oidc.a.client-id=client-a
quarkus.oidc.a.credentials.secret=client-a-secret
# Tenant 'b' configuration
quarkus.oidc.b.auth-server-url=http://localhost:8180/realms/quarkus-b
quarkus.oidc.b.client-id=client-b
quarkus.oidc.b.credentials.secret=client-b-secret
您可以从 quarkus.oidc.TenantResolver 返回 a 或 b 的租户 ID:
import quarkus.oidc.TenantResolver;
public class CustomTenantResolver implements TenantResolver {
@Override
public String resolve(RoutingContext context) {
String path = context.request().path();
if (path.endsWith("a")) {
return "a";
} else if (path.endsWith("b")) {
return "b";
} else {
// default tenant
return null;
}
}
}
在本例中,最后一个请求路径片段的值是一个租户 id,但如果需要,您可以实施更复杂的租户标识符解析逻辑。
5.10.2. 默认解析 复制链接链接已复制到粘贴板!
租户标识符的默认解析基于惯例,身份验证请求必须在请求路径的最后片段中包含租户标识符。
以下 application.properties 示例演示了如何配置名为 google 和 github 的两个租户:
# Tenant 'google' configuration
quarkus.oidc.google.provider=google
quarkus.oidc.google.client-id=${google-client-id}
quarkus.oidc.google.credentials.secret=${google-client-secret}
quarkus.oidc.google.authentication.redirect-path=/signed-in
# Tenant 'github' configuration
quarkus.oidc.github.provider=google
quarkus.oidc.github.client-id=${github-client-id}
quarkus.oidc.github.credentials.secret=${github-client-secret}
quarkus.oidc.github.authentication.redirect-path=/signed-in
在提供的示例中,两个租户都将 OIDC web-app 应用程序配置为使用授权代码流来验证用户,并在身份验证后生成会话 Cookie。在 Google 或 GitHub 验证当前用户后,用户将返回到经过身份验证的用户的 /signed-in 区域,如 JAX-RS 端点上的安全资源路径。
最后,要完成默认租户解析,请设置以下配置属性:
quarkus.http.auth.permission.login.paths=/google,/github
quarkus.http.auth.permission.login.policy=authenticated
如果端点在 http://localhost:8080 上运行,您也可以为用户提供登录到 http://localhost:8080/google 或 http://localhost:8080/github 的 UI 选项,而无需添加特定的 /google 或 /github JAX-RS 资源路径。身份验证完成后,租户标识符也会记录在会话 Cookie 名称中。因此,经过身份验证的用户可以访问安全应用程序区域,而无需将 google 或 github 路径值包含在安全 URL 中。
默认解析也可以用于 Bearer 令牌身份验证。仍然可能不太实际,因为租户标识符必须始终设置为最后一个路径片段值。
5.10.3. 使用注解解析 复制链接链接已复制到粘贴板!
您可以使用 io.quarkus.oidc.Tenant 注解来解析租户标识符,作为使用 io.quarkus.oidc.TenantResolver 的替代选择。
必须禁用主动 HTTP 身份验证(quarkus.http.auth.proactive=false)才能使它正常工作。如需更多信息,请参阅 主动身份验证 指南。
假设应用程序支持两个 OIDC 租户( hr 和 default 租户),所有带 @Tenant ("hr") 的资源方法和类都通过使用 quarkus.oidc.hr.auth-server-url 配置的 OIDC 供应商进行身份验证。相反,所有其他类和方法仍然通过使用默认 OIDC 供应商进行身份验证。
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import io.quarkus.oidc.Tenant;
import io.quarkus.security.Authenticated;
@Authenticated
@Path("/api/hello")
public class HelloResource {
@Tenant("hr")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "Hello!";
}
}
- 1
io.quarkus.oidc.Tenant注解必须放在资源类或资源方法上。