1. 概述

Keycloak 是一个开源的身份和访问管理(IAM)系统,与Spring Boot应用集成良好。本教程将介绍如何在Spring Boot应用中获取Keycloak用户ID。

2. 问题描述

Keycloak提供了诸如REST API安全、用户联邦、细粒度授权、社交登录、双因素认证(2FA)等功能。此外,我们还可以使用它实现基于OpenID Connect(OIDC)的单点登录(SSO)。假设我们有一个使用Keycloak通过OIDC保护的Spring Boot应用,并希望在应用中获取用户ID。在这种情况下,我们需要在Spring Boot应用中获取访问令牌或安全上下文。

2.1. Keycloak服务器作为授权服务器

为了简化,我们将使用嵌入式于Spring Boot应用中的Keycloak。假设我们在GitHub上使用的授权服务器项目。首先,我们在嵌入式Keycloak服务器的baeldung领域中定义customerClient客户端:keycloak spring boot 然后,我们将领域详细信息导出为customer-realm.json,并在application-customer.yml中设置:

keycloak:
  server:
    contextPath: /auth
    adminUser:
      username: bael-admin
      password: pass
    realmImportFile: customer-realm.json

最后,我们可以使用--spring.profiles.active=customer选项运行应用。现在,授权服务器准备就绪。启动服务器后,我们可以在http://localhost:8083/auth/访问欢迎页面。

2.2. 资源服务器

配置完授权服务器后,让我们设置资源服务器。为此,我们将使用GitHub上可用的Spring Boot Keycloak资源服务器项目。首先,我们将添加application-embedded.properties文件作为资源:

keycloak.auth-server-url=http://localhost:8083/auth
keycloak.realm=baeldung
keycloak.resource=customerClient
keycloak.public-client=true
keycloak.principal-attribute=preferred_username

现在,资源服务器已使用OAuth2授权服务器进行保护,必须登录到SSO服务器才能访问资源。我们可以使用--spring.profiles.active=embedded选项运行应用。

3. 获取Keycloak用户ID

从Keycloak获取用户ID可以通过使用客户端映射器来实现。

3.1. 客户端映射器

我们可以在客户端映射器中添加用户ID,并在Spring Boot应用中获取它。首先,在customerClient客户端中定义映射器:

User ID

然后,在CustomUserAttrController类中获取用户ID:

@Controller
public class CustomUserAttrController {

    @GetMapping(path = "/users")
    public String getUserInfo(Model model) {

        final DefaultOidcUser user = (DefaultOidcUser) SecurityContextHolder.getContext()
            .getAuthentication()
            .getPrincipal();

        String userId = "";

        OidcIdToken token = user.getIdToken();

        Map<String, Object> customClaims = token.getClaims();

        if (customClaims.containsKey("user_id")) {
            userId = String.valueOf(customClaims.get("user_id"));
        }

        model.addAttribute("username", user.getName());
        model.addAttribute("userID", userId);
         return "userInfo";
    }

}

我们使用IDTokengetClaims()方法获取映射器。接着,我们将用户ID添加到模型属性中。

3.2. Thymeleaf

我们将修改userInfo.html模板以显示用户ID信息:

<div id="container">
    <h1>
    User ID : <span th:text="${userID}">--userID--</span>.
    </h1>
</div>

3.3. 测试

运行应用后,我们可以通过导航至http://localhost:8081/users。使用用户名和密码baeldung:baeldung登录,将返回以下内容:

Message

4. 总结

本文介绍了如何在Spring Boot应用中从Keycloak获取用户ID。我们首先设置了调用安全应用所需的环境。然后,我们描述了如何使用IDToken和客户端映射器在Spring Boot应用中获取Keycloak用户ID。如往常一样,本教程的完整源代码可在GitHub上找到。同时,授权服务器的源代码也可在GitHub上查看