从 Java 代码中搜索 Keycloak 中的用户

Posted

技术标签:

【中文标题】从 Java 代码中搜索 Keycloak 中的用户【英文标题】:Searching users in Keycloak from Java code 【发布时间】:2020-09-20 18:22:39 【问题描述】:

我正在使用 Spring Boot、Keycloak 10、java 8 和 keycloak-admin-client jar。我能够获取用户、他的组和角色。

在搜索方面,我可以看到不同的搜索方法选项:

 List<UserRepresentation> search = getKeycloakInstance().realm("my-realm").users()
                .search("username");

https://www.keycloak.org/docs-api/10.0/javadocs/org/keycloak/admin/client/resource/UsersResource.html

但我需要做的是编写几个方法:

按角色搜索(因此搜索具有某些角色的用户)

按组和组属性搜索

以“包含”方式按文本(名字、姓氏、电子邮件)搜索:mytext

按角色和文本搜索

按 id 列表搜索(用户的 uuid)

我没有在 keycloak-admin-client 中看到这种可能性,或者我应该使用什么来代替 keycloak-admin-client ?

【问题讨论】:

您可能需要针对 keycloak API 构建自定义代码:keycloak.org/docs-api/10.0/rest-api/index.html 【参考方案1】:

不幸的是,keycloak-admin-client 没有提供很多搜索选项。

如何按角色查找用户:

RoleResource roleResource = getKeycloakInstance().realm("realm_name")
                          .roles().get("role_name");  
roleResource.getRoleUserMembers();

如何查找群组中的所有用户:

getKeycloakInstance().realm("realm_name").groups().group("your_group").members();

如何通过用户名、名字、姓氏、电子邮件查找用户:

getKeycloakInstance().realm("my-realm").users()
            .search("username", "lastName", "email");

如果您没问题,请尝试使用Keycloak Admin REST API 以获得更多搜索机会。

【讨论】:

谢谢,按 userIds 搜索呢?至于组和角色,我将不得不使用几个请求来一次搜索具有 xt、角色和组的用户。 Rest API 本身也没有像我看到的那样提供这样的机会,所以我将继续使用 admin-client jar。 我刚刚检查了搜索实现 (github.com/keycloak/keycloak/blob/master/services/src/main/java/…)。无法通过属性的多个值进行搜索。您只能按一个 id、名称、角色等进行搜索。例如按“lastName”搜索:search("lastName:mar", 0, 10) 将返回姓氏包含“mar”的前 10 个用户。如果您将部分用户数据存储在您的应用数据库中并且它与 keycloak 数据库同步,我建议您对您的应用数据库执行搜索以更加灵活。 我有过使用 Keycloak 的商业经验,我不能说我印象深刻。我们将用户数据存储在 Keycloak 中,但决定在我们的应用程序数据库中复制数据,以便能够执行灵活的用户搜索。这种方法的坏处是我们需要在两个 DB 中同步用户数据。

以上是关于从 Java 代码中搜索 Keycloak 中的用户的主要内容,如果未能解决你的问题,请参考以下文章

从 KeyCloak 导出所有用户

如何使用 Java API 从 keycloak 获取用户的名字、姓氏和属性?

Keycloak 用户存储 SPI 实现

Keycloak:用户基于角色的客户端登录访问限制

有没有办法使用 Keycloak Admin REST API 将用户添加到 Keycloak 中的多个组(批量)?

Keycloak:一个领域的多个电子邮件地址?