Spring 启动 Keycloak 多租户配置
Spring Boot Keycloak Multi Tenant Configuration
我有一个 Keycloak 实例,并为每个领域创建了两个领域和一个用户。
Realm1 (Tenant1) -> User 1
Realm2 (Tenant2) -> User 2
而且我有我的 spring 引导 application.yml(资源服务器 - API)用于一个特定领域并在我的代码中修复。
keycloak:
realm: Realm1
auth-server-url: https://localhost:8443/auth
ssl-required: external
resource: app
bearer-only: true
use-resource-role-mappings: true
它正在为 Realm1 工作和验证。
但现在我可以接收来自用户 2(租户 2)的请求并且令牌将无效,因为 public 密钥(realm1)对于签名请求 jwt 令牌(realm2)无效。
允许多领域多租户和动态配置的最佳方法是什么?
谢谢,
不要在 spring application.yaml 中定义 keycloak 配置,而是保留多个 keycloak.json 配置文件,并使用自定义 KeycloakConfigResolver:
public class PathBasedKeycloakConfigResolver implements KeycloakConfigResolver {
@Override
public KeycloakDeployment resolve(OIDCHttpFacade.Request request) {
if (request.getPath().startsWith("alternative")) { // or some other criteria
InputStream is = getClass().getResourceAsStream("/tenant1-keycloak.json");
return KeycloakDeploymentBuilder.build(is); //TODO: cache result
} else {
InputStream is = getClass().getResourceAsStream("/default-keycloak.json");
return KeycloakDeploymentBuilder.build(is); //TODO: cache result
}
}
}
我不确定这是否适用于 keycloak-spring-boot-starter
,但我认为只需在 KeycloakWebSecurityConfigurerAdapter 中连接自定义 KeycloakConfigResolver 就足够了:
@Configuration
@EnableWebSecurity
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Bean
public KeycloakConfigResolver keycloakConfigResolver() {
return new PathBasedKeycloakConfigResolver();
}
[...]
}
我有一个 Keycloak 实例,并为每个领域创建了两个领域和一个用户。
Realm1 (Tenant1) -> User 1
Realm2 (Tenant2) -> User 2
而且我有我的 spring 引导 application.yml(资源服务器 - API)用于一个特定领域并在我的代码中修复。
keycloak:
realm: Realm1
auth-server-url: https://localhost:8443/auth
ssl-required: external
resource: app
bearer-only: true
use-resource-role-mappings: true
它正在为 Realm1 工作和验证。
但现在我可以接收来自用户 2(租户 2)的请求并且令牌将无效,因为 public 密钥(realm1)对于签名请求 jwt 令牌(realm2)无效。
允许多领域多租户和动态配置的最佳方法是什么?
谢谢,
不要在 spring application.yaml 中定义 keycloak 配置,而是保留多个 keycloak.json 配置文件,并使用自定义 KeycloakConfigResolver:
public class PathBasedKeycloakConfigResolver implements KeycloakConfigResolver {
@Override
public KeycloakDeployment resolve(OIDCHttpFacade.Request request) {
if (request.getPath().startsWith("alternative")) { // or some other criteria
InputStream is = getClass().getResourceAsStream("/tenant1-keycloak.json");
return KeycloakDeploymentBuilder.build(is); //TODO: cache result
} else {
InputStream is = getClass().getResourceAsStream("/default-keycloak.json");
return KeycloakDeploymentBuilder.build(is); //TODO: cache result
}
}
}
我不确定这是否适用于 keycloak-spring-boot-starter
,但我认为只需在 KeycloakWebSecurityConfigurerAdapter 中连接自定义 KeycloakConfigResolver 就足够了:
@Configuration
@EnableWebSecurity
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Bean
public KeycloakConfigResolver keycloakConfigResolver() {
return new PathBasedKeycloakConfigResolver();
}
[...]
}