Spring Boot Keycloak 多租户配置

Luc*_*o82 5 spring multi-tenant keycloak

我有一个 Keycloak 实例,并创建了两个领域,并为每个领域创建了一个用户。

Realm1 (Tenant1) -> User 1
Realm2 (Tenant2) -> User 2
Run Code Online (Sandbox Code Playgroud)

我有一个特定领域的 spring boot 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
Run Code Online (Sandbox Code Playgroud)

它正在为 Realm1 工作并验证。

但现在我可以接收来自 user2 (tenant2) 的请求,并且令牌将无效,因为公钥 (realm1) 对于签名的请求 jwt 令牌 (realm2) 无效。

允许多领域的多租户和动态配置的最佳方法是什么?

谢谢,

Gee*_*nte 5

有整整一章的内容:2.1.18:多租户

不要在 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
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否适用于keycloak-spring-boot-starter,但我认为只需在 KeycloakWebSecurityConfigurerAdapter 中连接您的自定义 KeycloakConfigResolver 就足够了:

@Configuration
@EnableWebSecurity
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Bean
    public KeycloakConfigResolver keycloakConfigResolver() {
        return new PathBasedKeycloakConfigResolver();
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)