能否获取Keycloak中拥有会话的活跃用户列表?如何实现?
获取Keycloak中拥有会话的用户列表(去重+分页修复)
问题分析
GET /{realm}/clients/{id}/user-sessions接口的设计就是返回每个用户的所有会话记录,所以同一用户多会话会出现重复条目,这是正常行为;分页失效大概率是参数使用错误或权限不足。
可行解决方案
1. 接口调用+客户端去重
这是最直接的方式,利用现有接口获取所有会话后在客户端层面去重:
- 调用接口时带上正确的分页参数:该接口支持
first(起始位置,从0开始)和max(每页条数)参数,示例请求:curl -X GET "http://your-keycloak-domain/auth/admin/realms/{your-realm}/clients/{client-id}/user-sessions?first=0&max=50" \ -H "Authorization: Bearer {admin-access-token}" - 对返回结果按
userId或username去重,以JavaScript为例:// 假设sessions是接口返回的会话数组 const uniqueUserSessions = Array.from( new Map(sessions.map(s => [s.userId, s])).values() ); // uniqueUserSessions中每个用户仅保留一条会话记录,包含userId、username等信息
2. 修复分页失效问题
如果分页参数不生效,检查以下两点:
- 参数正确性:确认使用的是
first和max(部分旧版Keycloak可能用offset和limit,建议对照对应版本的官方文档); - 权限配置:确保调用API的客户端拥有
realm-management下的view-users和view-clients角色。配置路径:- 进入Keycloak控制台,选择目标Realm;
- 进入
Clients-> 你的调用客户端 ->Service Account Roles; - 在
Client Roles下拉框选择realm-management; - 添加
view-users和view-clients角色到已分配角色列表。
3. 替代方案(用户量较小时适用)
如果不想在客户端处理去重,可以先通过GET /{realm}/users获取所有用户,再逐个调用GET /{realm}/users/{userId}/sessions检查用户是否存在有效会话。但这种方式会产生大量请求,仅适合用户规模较小的场景。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

