如何通过id获取其他用户信息(用户名,名字)?[Keycloak]

21
如何基于用户ID获取Keycloak属性(用户名、名字、电子邮件等)? 我在Keycloak会话中使用的用户已经被分配了view-users角色,所以我应该能够列出至少所有用户,是否有任何可以使用的Keycloak类?
我在此尝试实现的目标是避免将Keycloak用户数据库复制到另一个本地数据库,但似乎不可能访问除当前会话中的用户信息之外的任何其他用户信息...
5个回答

26
您可以使用管理 REST API。相关API的详细描述可在此获得。您还可以使用JAVA包装器API。以下是一些示例。

示例1,REST:

获取访问令牌:

curl \
  -d "client_id=admin-cli" \
  -d "username=admin" \
  -d "password=secret" \
  -d "grant_type=password" \
  "http://localhost:8080/auth/realms/master/protocol/openid-connect/token"

获取所有用户:

curl \
  -H "Authorization: bearer eyJhbGciOiJSUzI...." \
  "http://localhost:8080/auth/admin/realms/master/users"

示例输出:

[
     {
        "id":"349f67de-36e6-4552-ac54-e52085109616",
        "username":"admin",
        "enabled":true,
        ...
     },
     {
        "id":"08afb701-fae5-40b4-8895-e387ba1902fb",
        "username":"lbalev",
        "enabled":true,
        ....
     }
  ]

按用户ID获取基于用户的用户:

curl \
  -H "Authorization: bearer eyJhbGciOiJSU...." \
  "http://localhost:8080/auth/admin/realms/master/users/349f67de-36e6-4552-ac54-e52085109616"

示例2,JAVA API:

根据用户ID获取用户:

public class TestUserAccess {

  private static final String SERVER_URL = "http://localhost:8080/auth";
  private static final String REALM = "master";
  private static final String USERNAME = "admin";
  private static final String PASSWORD = "secret";
  private static final String CLIENT_ID = "admin-cli";

  public static void main(String[] args) {

    Keycloak keycloak = KeycloakBuilder
        .builder()
        .serverUrl(SERVER_URL)
        .realm(REALM)
        .username(USERNAME)
        .password(PASSWORD)
        .clientId(CLIENT_ID)
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
        .build();

    UsersResource usersResource = keycloak.realm(REALM).users();
    UserResource userResource = usersResource.get("08afb701-fae5-40b4-8895-e387ba1902fb");
    System.out.println(userResource.toRepresentation().getEmail());
  }
}

上述示例的相关依赖关系为(请注意,版本可能不是最新的):

dependencies {
    compile group: 'org.keycloak', name: 'keycloak-admin-client', version: '3.3.0.CR2'
    compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.1.4.Final'
    compile group: 'org.jboss.resteasy', name: 'resteasy-client', version: '3.1.4.Final'
    compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: '3.1.4.Final'
}

你能解释一下为什么URL是localhost:8080吗?据我了解,Keycloak有一个不同的IP地址,类似于http://43.224.110.84:8080。 - Sifat Amin

11

这也是一种简单的方法,因为在上面的答案中,获取了所有用户信息,这不是正确的方式,因为如果有成千上万的用户,这将会是一个沉重的调用。

所以只需将用户名作为查询参数传递即可。

GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser

确保您使用管理员访问令牌进行调用。


最佳的按用户名搜索解决方案,谢谢!不幸的是,它不能与id参数一起使用。 - Shmuser
1
要通过用户ID检索用户表示,请使用/auth/admin/realms/{realm-name}/users/{id}端点。来源 - sjakovac
如果您找不到特定的现有用户,可能是您没有权限查看该用户,或者您所在的领域错误,例如在URL中使用了master而不是用户实际所在的领域。 - undefined

4

感谢 @Nikhil Shinde 分享 restapi 的端点。

就像他所说的,以下代码将返回类似的用户。

GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser

如果您想要精确的用户名匹配,请尝试使用exact=true。
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser&exact=true

来源 : https://www.keycloak.org/docs-api/15.0/rest-api/index.html#_users_resource

这是关于Keycloak REST API的用户资源文档。


你的回答似乎与你提到的那个非常相似。你添加了什么? - Elikill58
2
第二个URL提供了确切的用户,而不是类似用户列表。 - Sathish Kumar
1
谢谢,这对我有用:http://IP:8080/admin/realms/master/users?exact=true&username=myuser 在我的v17.01中,将路径中的/auth放入会导致错误。 - Hernaldo Gonzalez

2
您可以在Keycloak管理控制台的搜索栏中,仅通过ID进行简单搜索,就像这样,enter image description here
id:ac796f21-c4ef-4182-a70a-970bac598bd6

在输入用户ID之前,请使用id:

如果用户ID是12345

按ID搜索,

id:12345 

假设您有这个用户:
user01 - gayankod@gmail.com
使用通配符按电子邮件或用户名搜索
user%
%gmail.com
%kod%

不错!运行得很顺畅!我想了解更多关于这个的信息。有人知道这个在文档中的位置吗?我在那里找不到。 - undefined

1

Keycloak Rest API

版本 > 17 Quarkus 基础

// Below will return's look a like users
GET: http://localhost:8080/admin/realms/{real-name}/users?username=testUser

// Below Will return's exact same user
GET: http://localhost:8080/admin/realms/{real-name}/users?username=testUser&exact=true

如果使用遗留版本,请在URL中使用/auth/

// Below will return's look a like users
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser

// Below Will return's exact same user
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser&exact=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接