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

Sud*_*der 7 java single-sign-on spring-boot keycloak

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

我使用了以下适配器 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>
Run Code Online (Sandbox Code Playgroud)

下面是配置在 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/*
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

小智 1

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

OAUTH2术语提醒:

  1. 资源所有者
  2. 资源服务器
  3. 授权服务器
  4. 客户

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

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

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

为此,您需要做的是为领域中的每个用户设置正确的角色。

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

总结一下:

您可以对 FE 客户端执行任何您想要的操作...但最后,请求中的不记名令牌对于特定 API 的客户端/感兴趣的资源所承载的角色非常重要。

解决方案之一:

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

您可以在您的领域中仅使用一个客户端(以正确的方式配置所有 URL 等)来实现此功能。

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

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

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