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。