如何通过keycloak中的自定义属性获取用户?

Mil*_*iya 11 keycloak

我知道有管理 API 可以获取返回用户表示数组的用户列表。

GET /admin/realms/{realm}/groups/{id}/members
Run Code Online (Sandbox Code Playgroud)

返回

https://www.keycloak.org/docs-api/2.5/rest-api/index.html#_userrepresentation
Run Code Online (Sandbox Code Playgroud)

但是有没有办法通过自定义属性来获取用户?

小智 23

从 Keycloak 版本15.1.0开始即可启用此功能

使用GET /{realm}/usersAPI​​,q引入参数:搜索自定义属性的查询,格式为'key1:value2 key2:value2'

curl 'http://{{keycloak_url}}/auth/admin/realms/{{realm}}/users?q=phone:123456789'
Run Code Online (Sandbox Code Playgroud)

您还可以使用空格' '分隔符在此参数中组合多个属性

curl 'http://{{keycloak_url}}/auth/admin/realms/{{realm}}/users?q=phone:123456789 country:USA'
Run Code Online (Sandbox Code Playgroud)

文档: https: //www.keycloak.org/docs-api/15.1/rest-api/index.html#_users_resource


Luc*_*rcq 14

默认情况下这是不可能的,但 Keycloak 提供了通过服务提供者接口系统扩展其功能的可能性,该系统非常容易实现。

这是允许按自定义属性搜索的新路由示例:

public class SearchByAttributeResourceProvider implements RealmResourceProvider {
    private KeycloakSession session;

    public SearchByAttributeResourceProvider(KeycloakSession session) {
        this.session = session;
    }

    @Override
    public Object getResource() {
        return this;
    }

    @GET
    @Path("search-by-stuff/{stuffValue}")
    @Produces({MediaType.APPLICATION_JSON})
    public List<UserRepresentation> getUsersByStuff(@PathParam("stuffValue") String stuffValue) {
        return session
                .users()
                .searchForUserByUserAttribute("stuff", stuffValue, session.getContext().getRealm())
                                .stream()  
                                .map(userModel -> ModelToRepresentation.toRepresentation(session, session.getContext().getRealm(), userModel))
                                .collect(toList());
    } 

    @Override
    public void close() {

    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多详细信息:https : //www.keycloak.org/docs/latest/server_development/index.html#_extensions_rest


小智 5

使用最新版本的 keycloak (18.01),我们有 api


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    List<UserRepresentation> searchByAttributes(@QueryParam("q") String searchQuery);

Run Code Online (Sandbox Code Playgroud)

查询参数的格式为 'key:value' 。使用这个我们可以通过自定义属性获取所有用户的列表


Jan*_*raj 1

当前Keycloak API版本是4.8,有API: 获取用户返回用户列表,根据查询参数过滤

GET /{realm}/users
Run Code Online (Sandbox Code Playgroud)

请参阅文档: https: //www.keycloak.org/docs-api/4.8/rest-api/index.html#_users_resource

API 中仅提供此“搜索”。如果您需要按用户属性进行搜索,那么您需要在自己的代码中实现。