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

vdzxcuhz  于 2023-02-02  发布在  Java
关注(0)|答案(4)|浏览(370)

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

vecaoik1

vecaoik11#

你可以使用管理员REST API。相关API的详细描述可以在这里找到。你也可以使用JAVA Package 器API。请在下面找到几个例子。

    • 示例1,其余:**

获取访问令牌:

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'
}
weylhg0b

weylhg0b2#

这也是一个简单的方法,因为在上面的回答中,所有的用户信息都被提取出来,这不是正确的方式,因为如果有成千上万的用户,这将是一个沉重的呼叫。
因此只需将用户名作为查询参数传递

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

确保您为呼叫使用管理员访问令牌

j0pj023g

j0pj023g3#

感谢@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

图片来源:www.example.comhttps://www.keycloak.org/docs-api/15.0/rest-api/index.html#_users_resource

yeotifhr

yeotifhr4#

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

相关问题