知識庫 / Spring / Spring Security RSS 訂閱

在Spring中獲取Keycloak用户ID

Spring Security
HongKong
6
12:02 PM · Dec 06 ,2025

1. 概述

Keycloak 是一個開源身份和訪問管理 (IAM) 系統,與 Spring Boot 應用程序集成良好。 在本教程中,我們將描述如何在 Spring Boot 應用程序中獲取 Keycloak 用户 ID。

2. 問題陳述

Keycloak 提供諸如保護 REST API、用户聯邦、細粒度授權、社交登錄、雙因素身份驗證 (2FA) 等功能。 此外,我們還可以利用它來實現使用 OpenID Connect ( OIDC) 的單點登錄 (SSO)。 假設我們有一個使用 OIDC 通過 Keycloak 保護的 Spring Boot 應用程序,並且我們希望在 Spring Boot 應用程序中獲取用户 ID。 在這種情況下,我們需要在 Spring Boot 應用程序中獲取訪問令牌或安全上下文。

2.1. Keycloak 服務器作為授權服務器

為了簡化操作,我們將 Keycloak 嵌入在 Spring Boot 應用程序中。 假設我們正在使用 在 GitHub 上提供的 授權服務器項目。 首先,我們將在嵌入式 Keycloak 服務器的 customerClient 客户端中定義 realm baeldung 然後,我們將 realm 詳細信息導出為 customer-realm.json,並將 realm 文件設置為我們的 application-customer.yml

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

最後,我們可以使用 –spring-boot.run.profiles=customer 選項運行應用程序。現在,授權服務器已準備就緒。運行服務器後,我們可以通過 http://localhost:8083/auth/ 訪問授權服務器的歡迎頁面。

2.2 資源服務器

現在我們已經配置了授權服務器,接下來我們將設置資源服務器。為此,我們將使用來自 GitHub 的資源服務器項目。首先,讓我們將 <em >application-embedded.properties</em> 文件添加為資源:

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-boot.run.profiles=embedded 選項運行應用程序。

3. 獲取 Keycloak 用户 ID

通過使用客户端映射器,可以從 Keycloak 中獲取用户 ID。

3.1. 客户端映射器

我們可以為客户端映射器添加用户 ID,並在 Spring Boot 應用程序中獲取它。首先,我們在 customerClient 客户端中定義一個客户端映射器:

然後,我們在 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";
    }

}

我們使用 getClaims() 方法從 IDToken 中獲取 mapper。然後,我們將用户 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,將返回以下內容:

4. 結論

在本文中,我們探討了如何在 Spring Boot 應用程序中獲取 Keycloak 的用户 ID。首先,我們設置了調用安全應用程序所需的環境。然後,我們使用 IDToken 和客户端映射器在 Spring Boot 應用程序中獲取 Keycloak 用户 ID。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.