1.18. 动态租户配置解析
要在避免配置文件中的过度条目时创建多个租户配置,您可以使用 io.quarkus.keycloak.pep.TenantPolicyConfigResolver
接口在运行时以编程方式定义它们。
package org.acme.security.keycloak.authorization; import java.util.Map; import jakarta.enterprise.context.ApplicationScoped; import io.quarkus.keycloak.pep.TenantPolicyConfigResolver; import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerConfig; import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerTenantConfig; import io.quarkus.oidc.OidcRequestContext; import io.quarkus.oidc.OidcTenantConfig; import io.smallrye.mutiny.Uni; import io.vertx.ext.web.RoutingContext; @ApplicationScoped public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResolver { private final KeycloakPolicyEnforcerTenantConfig enhancedTenantConfig; private final KeycloakPolicyEnforcerTenantConfig newTenantConfig; public CustomTenantPolicyConfigResolver(KeycloakPolicyEnforcerConfig enforcerConfig) { this.enhancedTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder(config) .paths("/enhanced-config") .permissionName("Permission Name") .get("read-scope") .build(); this.newTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder() .paths("/new-config") .claimInformationPoint(Map.of("claims", Map.of("grant", "{request.parameter['grant']}"))) .build(); } @Override public Uni<KeycloakPolicyEnforcerTenantConfig> resolve(RoutingContext routingContext, OidcTenantConfig tenantConfig, OidcRequestContext<KeycloakPolicyEnforcerTenantConfig> requestContext) { String path = routingContext.normalizedPath(); String tenantId = tenantConfig.tenantId.orElse(null); if ("enhanced-config-tenant".equals(tenantId) && path.equals("/enhanced-config")) { return Uni.createFrom().item(enhancedTenantConfig); } else if ("new-config-tenant".equals(tenantId) && path.equals("/new-config")) { return Uni.createFrom().item(newTenantConfig); } return Uni.createFrom().nullItem(); } }
package org.acme.security.keycloak.authorization;
import java.util.Map;
import jakarta.enterprise.context.ApplicationScoped;
import io.quarkus.keycloak.pep.TenantPolicyConfigResolver;
import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerConfig;
import io.quarkus.keycloak.pep.runtime.KeycloakPolicyEnforcerTenantConfig;
import io.quarkus.oidc.OidcRequestContext;
import io.quarkus.oidc.OidcTenantConfig;
import io.smallrye.mutiny.Uni;
import io.vertx.ext.web.RoutingContext;
@ApplicationScoped
public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResolver {
private final KeycloakPolicyEnforcerTenantConfig enhancedTenantConfig;
private final KeycloakPolicyEnforcerTenantConfig newTenantConfig;
public CustomTenantPolicyConfigResolver(KeycloakPolicyEnforcerConfig enforcerConfig) {
this.enhancedTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder(config)
.paths("/enhanced-config")
.permissionName("Permission Name")
.get("read-scope")
.build();
this.newTenantConfig = KeycloakPolicyEnforcerTenantConfig.builder()
.paths("/new-config")
.claimInformationPoint(Map.of("claims", Map.of("grant", "{request.parameter['grant']}")))
.build();
}
@Override
public Uni<KeycloakPolicyEnforcerTenantConfig> resolve(RoutingContext routingContext, OidcTenantConfig tenantConfig,
OidcRequestContext<KeycloakPolicyEnforcerTenantConfig> requestContext) {
String path = routingContext.normalizedPath();
String tenantId = tenantConfig.tenantId.orElse(null);
if ("enhanced-config-tenant".equals(tenantId) && path.equals("/enhanced-config")) {
return Uni.createFrom().item(enhancedTenantConfig);
} else if ("new-config-tenant".equals(tenantId) && path.equals("/new-config")) {
return Uni.createFrom().item(newTenantConfig);
}
return Uni.createFrom().nullItem();
}
}