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

How to get users by custom attributes in keycloak?

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

GET /admin/realms/{realm}/groups/{id}/members

returns

https://www.keycloak.org/docs-api/2.5/rest-api/index.html#_userrepresentation

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

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

GET /{realm}/users

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

API 中只有这个 "search" 可用。如果你需要按用户属性搜索,那么你需要在自己的代码中实现。

默认情况下这是不可能的,但 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() {

    }
}

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

这是从 Keycloak 版本 15.1.0

开箱即用的

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

curl 'http://{{keycloak_url}}/auth/admin/realms/{{realm}}/users?q=phone:123456789'

您还可以使用 space ' ' 分隔符

在此参数中组合多个属性
curl 'http://{{keycloak_url}}/auth/admin/realms/{{realm}}/users?q=phone:123456789 country:USA'

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