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
客户端: 然后,我们将领域详细信息导出为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
客户端中定义映射器:
然后,在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";
}
}
我们使用IDToken
的getClaims()
方法获取映射器。接着,我们将用户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。如往常一样,本教程的完整源代码可在GitHub上找到。同时,授权服务器的源代码也可在GitHub上查看。