如何通过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}/users
API,引入参数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
我知道有管理 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}/users
API,引入参数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