Keycloak - 将所有用户映射到角色

Posted

技术标签:

【中文标题】Keycloak - 将所有用户映射到角色【英文标题】:Keycloak - Get all Users mapped to roles 【发布时间】:2016-11-17 05:41:57 【问题描述】:

我知道keycloak已经暴露在api下面了,

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-services</artifactId>
    <version>2.0.0.Final</version>
</dependency>

有完整的文档here。我在这里找不到所需的 api 来获取映射到他们的特定角色的所有用户。

问题陈述 - 我需要从 keycloak 服务器中挑选所有具有特定角色的用户。我需要向所有角色映射到他们的用户发送电子邮件。

【问题讨论】:

【参考方案1】:

有一个出色的feature request 通过 API 请求此功能。

同时,如果您的要求是一次性的,您可以通过查询将 KEYCLOAK_ROLE 连接到 USER_ROLE_MAPPING 到 USER_ENTITY 的数据库来获取用户名(或电子邮件地址)

类似:

SELECT username
FROM keycloak_role kr 
   JOIN user_role_mapping rm ON kr.id = rm.role_id
   JOIN user_entity ue ON rm.user_id = ue.id
WHERE kr.name = 'your_role_name';

【讨论】:

好东西,谢谢分享,而且他们还有管理模块来处理这类查询,对吧..?? 我们如何使用 java 客户端 api 做到这一点? 此查询仅显示手动分配的用户。对我来说,我们有一个 LDAP 服务器,从中同步角色 - 此查询未返回具有角色访问权限的用户(从 LDAP 读取) 您的链接似乎已损坏,工作链接:issues.redhat.com/browse/KEYCLOAK-1902?_sscc=t【参考方案2】:

基于documentation,它似乎是这个API:

GET /realm/clients/id/roles/role-name/users

它已经存在了一段时间。然而,在这个旧版本中,这种方式无法获得超过 100 个用户。后来修复了,增加了分页的可能性。

【讨论】:

链接已损坏 - 使用 keycloak.org/docs-api/12.0/rest-api/index.html#_roles_resource 感谢您修改链接。看起来旧版本的文档已被删除。【参考方案3】:

这是另一个有趣的查询,它还会显示其他有用的字段。

SELECT kr_role.REALM_ID 'Realm', cl.CLIENT_ID 'Realm Client', 
    kr_role.NAME 'Role Name', 
    kr_role.DESCRIPTION 'Role Description', 
    user_ent.USERNAME 'Domain ID', user_ent.EMAIL 'Email'
  FROM keycloak_role kr_role, user_role_mapping role_map, 
    user_entity user_ent, client cl
  WHERE role_map.USER_ID = user_ent.ID
  AND kr_role.ID = role_map.ROLE_ID
  AND kr_role.CLIENT = cl.ID
  AND cl.REALM_ID = '<realm_name>'
  AND cl.CLIENT_ID = '<client_name>'
  ORDER BY 1, 2, 3;

【讨论】:

【参考方案4】:

现在应该可以使用更新的休息端点来实现这一点。

Set<UserRepresentation> usersOfRole = realmResource.roles().get(roleName).getRoleUserMembers();

【讨论】:

【参考方案5】:
SELECT username,
       kr.NAME,
       kr.REALM_ID
FROM KEYCLOAK_ROLE kr
JOIN USER_ROLE_MAPPING rm ON kr.id = rm.role_id
JOIN USER_ENTITY ue ON rm.user_id = ue.id
ORDER BY USERNAME,
         NAME,
         REALM_ID;

【讨论】:

以上是关于Keycloak - 将所有用户映射到角色的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 授权 - 最佳实践角色与组

Keycloak REST API 无法从用户角色映射中删除客户端级角色

仅创建用户 Keycloak 角色?

根据角色将不同的用户重定向到 Keycloak 登录的不同页面

Python Keycloak 获取用户的角色和组

Keycloak 用户角色 Angular 和 .net 核心