1. 概述
Keycloak 是一個開源身份和訪問管理 (IAM) 系統,與 Spring Boot 應用程序集成良好。 在本教程中,我們將描述如何在 Spring Boot 應用程序中獲取 Keycloak 用户 ID。
2. 方案概述
Keycloak 提供諸如安全 REST API、用户聯邦、細粒度授權、社交登錄、雙因素身份驗證 (2FA) 等功能。 此外,我們還可以利用它來實現使用 OpenID Connect (OIDC) 的單點登錄 (SSO)。 假設我們有一個使用 Keycloak 進行 OIDC 授權的 Spring Boot 應用程序,並且我們希望在 Spring Boot 應用程序中獲取用户 ID。 在這種情況下,我們需要在 Spring Boot 應用程序中獲取訪問令牌或安全上下文。
2.1. 授權服務器作為 Keycloak 服務器
為了簡化操作,我們將使用嵌入在 Spring Boot 應用程序中的 Keycloak。 讓我們假設我們正在使用授權服務器項目 可在 GitHub 上找到。 首先,我們將定義 customerClient 客户端在 baeldung 領域中的: 
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 上找到的資源服務器項目。 首先,讓我們將 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-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 中獲取映射器。然後,我們將用户 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。