【问题标题】:Keycloak: Can not read users realm roles as admin cli when calling the admin rest apiKeycloak:调用 admin rest api 时无法将用户领域角色读取为 admin cli
【发布时间】:2020-12-29 19:02:26
【问题描述】:

我使用 keycloak 11 作为我的 spring boot 服务的 openid 连接提供程序。到目前为止一切正常。

问题:

我有一个使用网络客户端的服务。它嵌套在我的服务中,并使用带有admin-cli 客户端的客户端身份验证。这样可行。当我访问 /users/userId 时,我得到了用户表示。我现在遇到的问题是用户的领域角色没有添加到表示中。

docs 中,此参数被称为 String [] 并在 UserRepresentation 中标记为可选。

我认为如果我配置 Service account roles -> Client Roles -> realm-management -> realmAdmin ,客户端应该能够查看整个用户输出。

但是如果我使用 postman 并以 ali-admin 的身份调用 api,它不会包含在 JSON 响应中。

我也尝试在我的 KeycloakUserRepresentationModel 中添加属性

public class KeycloakUserRepresentation {

    private String id;
    private String username;
    private String firstName;
    private String lastName;
    private String email;
    private Boolean emailVerified;
    private Boolean enabled;
    private Map<String, List<String>> attributes;
    private String[] realmRoles;

并执行请求。数组 realmRoles 始终为空。

你能告诉我我必须配置什么才能将用户 realmRoles 读取为 admin-cli 吗?

【问题讨论】:

    标签: java spring-boot oauth keycloak openid-connect


    【解决方案1】:

    您需要首先代表admin(或具有类似权限的用户)从admin-cli 客户端请求令牌:

    curl    -d "client_id=admin-cli" \
            -d "username=$ADMIN_NAME" \
            -d "password=$ADMIN_PASSWORD" \
            -d "grant_type=password" \
            https://$KEYCLOAK_IP/auth/realms/master/protocol/openid-connect/token
    

    然后要获取与给定领域角色关联的用户列表,您可以在调用以下端点时使用该令牌:

    GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/roles/<ROLE_NAME>/users
    

    JSON 响应中,您可以检查您的用户是否属于该列表。

    或者,您可以调用 Rest Admin API 来

    1. 获取用户,然后提取其ID
    2. 在对端点的调用中使用其ID 获取与该用户关联的角色:GET &lt;KEYCLOAK_HOST&gt;/auth/admin/realms/&lt;YOUR_REALM&gt;/users/&lt;USER_ID&gt;/role-mappings

    【讨论】:

      【解决方案2】:

      我发现有两种方法。

      第一:dreamcrash提到的url:

      GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/roles/<ROLE_NAME>/users
      

      在这里,您可以获得具有所请求角色的所有用户。

      第二:

      GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/users/<USER_ID>/role-mappings
      

      您可以在此处获取特定用户的领域和客户端映射。

      我认为解决方案 2 是更好的方法,因为您只加载特定用户的信息。解决方案 1 加载所有用户及其整个帐户信息。这可能会导致性能下降。

      我不明白的是,通用 /users/id 端点没有返回 UserRepresentation 响应对象中的大部分可选参数。我认为总是在文档中的某个地方找到一条路线太烦人了。我知道这是一个开源项目,但我认为这应该修复或至少解释如何配置 keycloak 以获取信息。

      【讨论】:

      • 是的,这很烦人。但另一方面,有时您只想要没有所有角色的用户。顺便说一句,您提到的解决方案 2 是我编写的替代解决方案,我现在只是更新答案以明确提及端点
      • 抱歉,我错过了。再次感谢您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2021-06-01
      • 2019-12-07
      • 2019-06-04
      • 2021-12-15
      • 2017-05-26
      • 2020-10-16
      相关资源
      最近更新 更多