如何在 spring-boot 应用程序中配置多个 Keycloak sso 客户端?

Posted

技术标签:

【中文标题】如何在 spring-boot 应用程序中配置多个 Keycloak sso 客户端?【英文标题】:How to configure multiple Keycloak sso clients in spring-boot application? 【发布时间】:2019-12-05 21:50:09 【问题描述】:

我正在使用 Spring Boot 微服务配置 Keycloak SSO。我希望多个 keycloak 客户端访问 spring boot 服务。如果在 Spring Boot 应用程序pom.xml 中使用 Keycloak 适配器,则所需的属性仅支持一个客户端和密钥。 spring boot app运行时如何添加多个客户端?

我在pom.xml中使用了以下适配器

<dependency>
    <groupId>org.keycloak.bom</groupId>
    <artifactId>keycloak-adapter-bom</artifactId>
    <version>5.0.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

以下配置在application.properties

keycloak.auth-server-url=http://localhost:9080/auth
keycloak.realm=test
keycloak.ssl-required=external
keycloak.resource=rest-api
keycloak.credentials.secret=62s4376d-9b45-4aa3-abcb-1abdefc4fab88
keycloak.use-resource-role-mappings = true
keycloak.security-constraints[0].authRoles[0]=rest-api
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/api/*

以上属性只支持一种客户端配置,只允许客户端rest-api生成的token添加到application.properties中。

我想在 Keycloak 中动态创建客户端,并希望 spring-boot 应用程序允许所有客户端生成令牌。

动态客户端注册可用于 spring boot oAuth2 配置,但找不到任何在 spring boot 应用程序中配置 keycloak 多个客户端的示例

如果有人解决了类似的需求并愿意分享配置或示例,将会很有帮助。

【问题讨论】:

你好@SudoCoder 你找到解决方案了吗?我有同样的问题 @DrQuestion 请参考medium.com/@bcarunmail/… 我使用了本文中解释的集成架构。希望这会有所帮助。 @SudoCoder 我不确定这篇文章如何帮助您实现您的要求。我想在我的应用程序中做同样的事情。你能解释一下吗 @pvpkiran 对此没有简单的解决方案,我通过将zuul路由器放在前面并在zuul级别对用户进行身份验证来实现这一点。我关注了这个medium.com/@bcarunmail/…。谢谢 【参考方案1】:

也许你应该采取不同的方法。

OAUTH2 术语提示:

    资源所有者 资源服务器 授权服务器 客户

通常,API 代表一个资源服务器。如果你看一下 keycloak spring adapter,其中一个配置参数是keycloak.resource,这实际上是 Keycloak 中的客户端名称。

因此,随之而来的是您将拥有每个微服务的客户端,因为它们正在保护/服务不同的资源。

(对于那些客户端,您通常需要设置角色,例如,ADMIN、REGULAR USER、SUPER USER)

要实现这一点,您必须为您领域中的每个用户设置正确的角色。

令牌何时进入 API(无论它是如何生成的 - 由哪个客户端生成),API 将(除了检查有效性之外)解码 JWT 并查看资源属性并查看您对分配的特定资源有什么角色到为请求提供服务的 API(微服务)。

总结:

你可以对你的 FE 客户端做任何你想做的事情......但最后,请求中的不记名令牌对于特定 API 的客户端/感兴趣的资源具有什么角色很重要。

解决方案之一:

单一 API - 单一资源集 FE 客户端:React SPA、androidios

您可以在您的领域中仅使用一个客户端(以适当的方式配置所有 URL 等)以使其正常工作。

但是,如果出于某种原因您的 FE 应用程序需要更多客户端,您可以添加它们,但在这种情况下,您可以继续使用已经存在的主客户端/资源的角色,或者您可以在每个新客户端上设置角色并使用复合角色的优势。

例如 android-app-client,角色:super-user-role...

使这个角色复合并说,拥有这个角色的每个人都需要 API 客户端的 admin-user-role。

【讨论】:

【参考方案2】:

经过努力,我发现它很简单。 您只需要实现自己的 KeycloakSpringBootConfigResolver,使用不同的配置来解决不同的部署。然后豆它。 keycloak 适配器将使用您的 bean 来解析不同请求的部署。

【讨论】:

分享你的 KeycloakSpringBootConfigResolver 不是更好吗? :)

以上是关于如何在 spring-boot 应用程序中配置多个 Keycloak sso 客户端?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring-boot中添加多个application.properties文件?

如何在spring-boot可执行jar文件中配置java logging.properties

spring-boot中如何配置tomcat访问日志的位置和名称?

使用spring-boot在多个数据库之间进行数据迁移

如何在 spring-boot 配置中加载 application.yaml 配置以进行硒测试

grails 3(spring-boot) - 如何配置hibernate二级缓存