如何通过ID获取其他用户的信息(用户名,名字)? [钥匙斗篷]

时间:2019-04-12 01:36:15

标签: java api keycloak user-management

如何根据用户ID获取用户密钥斗篷属性(用户名,名字,电子邮件...)? 我在Keycloak会话中使用的用户已经分配了 view-users 角色,因此我应该能够至少列出所有用户,我可以使用任何Keycloak类吗?

我在这里想要实现的目的是避免将keycloak用户数据库复制到另一个本地数据库,但是除了当前会话中的信息外,似乎无法访问其他任何用户信息...

2 个答案:

答案 0 :(得分:2)

您可以使用Admin REST API。 here提供了有关API的详细说明。您也可以使用JAVA包装器API。请在下面找到几个示例。

示例1,REST:

获取访问令牌:

ctype_wider(te1, te2)

获取所有用户:

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获取用户:

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

示例2,JAVA API:

根据二手ID获取二手:

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

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

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());
  }
}

答案 1 :(得分:1)

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

所以只需将用户名作为查询参数

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

确保您为通话使用了管理员访问令牌