Spring Boot Keycloak 多租户配置

Posted

技术标签:

【中文标题】Spring Boot Keycloak 多租户配置【英文标题】:Spring Boot Keycloak Multi Tenant Configuration 【发布时间】:2021-12-11 17:38:02 【问题描述】:

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

Realm1 (Tenant1) -> User 1
Realm2 (Tenant2) -> User 2

我有一个特定领域的 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

它正在为 Realm1 工作和验证。

但现在我可以接收来自用户 2(租户 2)的请求,并且令牌将无效,因为公钥(领域 1)对于签名的请求 jwt 令牌(领域 2)无效。

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

谢谢,

【问题讨论】:

【参考方案1】:

上面有一整章:2.1.18: Multi-Tenanacy

不要在 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();
    

    [...]

【讨论】:

感谢您的快速回复@GeerPt 我还有另一个问题/疑问。假设我有 10 个微服务需要保护。我是否必须在每个中定义所有相同的多个 keycloak.json?谢谢, 这 10 个微服务都是面向用户的吗?好的。否则:这取决于您如何设置后端到后端的安全性。 想象一下那个场景......前端应用程序 (app1) --> Api (app2) --> Api (app3)。但是 app1 可以从 realm_1 和 realm_2 进行登录(请求访问令牌)。对于这个例子,app1 应该是公共的,app2 和 app3 只承载? 好吧,如果您在 app1 和 app2 之间使用 OAuth2 访问令牌,则 app2 还需要能够验证来自 realm1 和 realm2 的令牌。我还没有这样做,但请尝试一下,如果您遇到问题,请提出新问题。

以上是关于Spring Boot Keycloak 多租户配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring boot keycloak 适配器 + spring security 强制更新 oAuth 令牌(访问令牌 + 刷新令牌)。?

Spring Boot + Spring Data 多租户

Spring Boot - 多租户 - 优化 API 的响应时间

使用多租户时的 Spring Boot 范围问题

Spring Boot 中的多租户

Keycloak 中的多租户可以在一个领域内完成吗?