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 REST API 无法从用户角色映射中删除客户端级角色