【问题标题】:How can I get other users info(username, firstname) by id? [Keycloak]如何通过 id 获取其他用户信息(用户名、名字)? [钥匙斗篷]
【发布时间】:2019-09-02 17:25:21
【问题描述】:

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

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

【问题讨论】:

    标签: java api keycloak user-management


    【解决方案1】:

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

    【讨论】:

    • 您的回答似乎与您提到的那个非常相似。你在里面加了什么?
    • 第二个 url 给出了确切的用户,而不是看起来像用户的列表。
    【解决方案2】:

    您可以使用管理 REST API。相关 API 的详细说明可参考here。您也可以使用 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'
    }
    

    【讨论】:

      【解决方案3】:

      这个方法也很简单,因为在上面的答案中,所有的用户信息都被获取了,这不是正确的方法,因为万一有成千上万的用户,这将是一个繁重的调用。

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

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

      确保您在通话中使用管理员访问令牌

      【讨论】:

      • 按用户名搜索的最佳解决方案,谢谢!不幸的是,它不适用于 id 参数。
      • 要通过用户 ID 检索用户表示,请使用 /auth/admin/realms/{realm-name}/users/{id} 端点。 Source
      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 2021-08-03
      • 2019-08-02
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多