如何在Java Spring项目中不使用Adapter获取Keycloak额外Realm的用户会话
查看Keycloak指定Realm的用户会话(Spring Boot实现)
依赖准备
确保项目中引入Keycloak管理客户端依赖,以Maven为例:
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-admin-client</artifactId> <version>对应你的Keycloak版本</version> </dependency>
修改代码实现会话查询
你的现有代码仅获取了Realm资源实例,未调用会话查询API,以下是完整的实现代码:
import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.representations.idm.UserSessionRepresentation; import java.util.List; public class KeycloakSessionViewer { public static void main(String[] args) { // 初始化Keycloak管理客户端 Keycloak keycloak = KeycloakBuilder .builder() .serverUrl("http://localhost:8080/auth") .realm("master") // 通过master域完成身份认证 .username("admin") .password("admin") .clientId("admin-cli") // 需使用具备Realm管理权限的客户端,默认admin-cli符合要求 .build(); // 获取目标springboot Realm的资源 RealmResource realmResource = keycloak.realm("springboot"); // 查询该Realm下所有用户会话 List<UserSessionRepresentation> userSessions = realmResource.sessions().getUserSessions(); // 遍历输出会话详情 for (UserSessionRepresentation session : userSessions) { System.out.println("会话ID: " + session.getId()); System.out.println("关联用户ID: " + session.getUserId()); System.out.println("用户名: " + session.getUsername()); System.out.println("关联客户端列表: " + session.getClients()); System.out.println("会话创建时间: " + session.getStart()); System.out.println("最后活跃时间: " + session.getLastSessionRefresh()); System.out.println("------------------------------"); } // 关闭客户端连接 keycloak.close(); } }
关键注意事项
- 客户端权限:必须使用拥有Realm管理权限的客户端,默认的
admin-cli是Keycloak自带的管理客户端,直接可用;若使用自定义客户端,需为其分配realm-management客户端下的view-sessions、view-users等角色。 - 用户权限:用于登录的用户(示例中为admin)需要具备
springbootRealm的会话查看权限,或拥有全局管理权限。 - 会话字段:
UserSessionRepresentation包含会话的核心元数据,可根据业务需求提取对应字段做进一步处理。
内容的提问来源于stack exchange,提问作者Eqnuhy77G2
相关产品推荐
相关产品推荐

