You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否获取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角色。配置路径:
    1. 进入Keycloak控制台,选择目标Realm;
    2. 进入Clients -> 你的调用客户端 -> Service Account Roles;
    3. 在Client Roles下拉框选择realm-management;
    4. 添加view-users和view-clients角色到已分配角色列表。

3. 替代方案(用户量较小时适用)

如果不想在客户端处理去重,可以先通过GET /{realm}/users获取所有用户,再逐个调用GET /{realm}/users/{userId}/sessions检查用户是否存在有效会话。但这种方式会产生大量请求,仅适合用户规模较小的场景。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:38:14