Keycloak REST API中缺少用户角色

23

我想问一下,是否有人知道为什么在REST ADMIN API请求的用户详细信息中没有角色。我看到了一些帖子处理这个主题,但要么没有清晰的答案,要么建议使用keycloak-admin-client,但那似乎不太方便。也许我需要在管理控制台中映射角色或使用claims?角色是最重要的用户属性之一,所以它们没有像其他用户属性一样被检索出来的原因是什么?有任何建议吗?谢谢

GET /auth/admin/realms/{realm}/users 

{
  "id": "efa7e6c0-139f-44d8-baa8-10822ed2a9c1",
  "createdTimestamp": 1516707328588,
  "username": "testuser",
  "enabled": true,
  "totp": false,
  "emailVerified": false,
  "firstName": "Test",
  "lastName": "User",
  "email": "test@xxx.com",
  "attributes": {"xxx": ["123456"]},
  "disableableCredentialTypes": ["password"],
  "requiredActions": []
}
5个回答

36

您在用户详细信息中无法获取角色,因为REST API是严格基于资源的,而角色是单独的对象,只与用户相关联。以下REST URL可用于获取用户的角色
获取相关领域角色:
GET /auth/admin/realms/{realm}/users/{user-uuid}/role-mappings/realm
获取特定客户端的关联角色:
GET /auth/admin/realms/{realm}/users/{user-uuid}/role-mappings/clients/{client-uuid}


5
我也有同样的问题,我需要了解与用户相关联的角色和组。为了获取这些信息,我使用以下网址:https://www.keycloak.org/docs-api/3.0/rest-api/index.html#_users_resourceURI: GET /admin/realms/{realm}/users/{id}根据上述链接提供的文档,它应该提供包括角色和组在内的用户详细信息。 - Dreamer
6
由于响应中缺少角色和组信息,导致严重的效率问题,有时需要进行大约20次请求才能按名称、角色和组搜索用户。 - michealAtmi
即使我已经为用户映射了角色,GET /auth/admin/realms/{realm}/users/{user-uuid}/role-mappings/realm 仍返回空结果。 - Süleyman Sümertaş

2
我也尝试过根据Keycloak API文档,将这些信息获取在一个调用的范围内,但没有结果。我还尝试使用不同的映射器为客户端添加一些信息到令牌数据、用户信息等等,但是看起来我们无法使用GET /auth/admin/realms/{realm}/usersGET /auth/admin/realms/{realm}/users/{userId}端点来获取那些信息。
在我的情况下,我需要获取用户列表,带分页和搜索选项,并且我需要有关分配给用户的客户端角色和用户所在组的信息。
因此,我需要进行大量API调用。我需要获取用户列表,然后对于每个用户,我需要通过额外的API调用获取用户组和客户端角色,并组合这些信息。还需要进行API调用以获取用户计数。但是,为了获取10个用户所需的信息,不需要超过20个API调用。
所以我做了什么。
作为另一种选择,我直接连接了Keycloak数据库,并使用TypeORM的一个SQL查询完成了需要的操作。我创建了模型和关系,并且非常容易地完成了操作。在我的情况下,我使用了USER_ENTITYUSER_ROLE_MAPPINGKEYCLOAK_ROLEUSER_GROUP_MEMBERSHIPKEYCLOAK_GROUP表。
这种方法效果很好。唯一的问题是,也许在未来的Keycloak版本中,会对数据库结构进行一些更改...在这种情况下,需要调查这些更改并在模型中进行更新后再更新Keycloak版本。
如果你像我这样做,请确保不要更改Keycloak数据库中的任何内容。或者,如果您想执行插入或删除操作而不使用Keycloak API,请确保您拥有有关Keycloak数据库结构的所有信息。实际上有大约93个表。

我在这里遇到了同样的问题。你是如何将Nestjs连接到Keycloak数据库的? - Paul
1
在这种情况下,我使用TypeORM使用Keycloak数据库的凭据完成了它。我创建了一个模块来处理Keycloak数据库,并限制了更改数据库中内容的访问权限,但是公开了获取数据的功能。 - CyberEternal

1
您可以使用以下代码获取用户的所有角色映射: GET /{realm}/users/{id}/role-mappings


0
你可以尝试以下方法:
// Step 1: Get user information
const userInfoResponse = await axios.get(
  `${baseURL}/auth/realms/${realm}/protocol/openid-connect/userinfo`,
  { headers }
);

// Step 2: Configure headers for the admin API request
const config = {
  headers: {
    Authorization: `Bearer ${tokenResponse.data.access_token}`,
    'Content-Type': 'application/json',
  },
};

// Step 3: Retrieve role mappings for the user
const response = await axios.get(
  `${baseURL}/auth/admin/realms/${realm}/users/${userInfoResponse.data.sub}/role-mappings/realm`,
  config
);

这解决了我的Keycloak v.15问题


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0
从开发者工具中查看(Ctrl+Shift+i或者F12),我发现你可以通过向以下端点发送请求来获取它。
{{keycloak_url}}/admin/realms/{{realm}}/ui-ext/effective-roles/users/{{userId}}

通过传递必要的参数,以及从认证角度来看的一切必要的内容。

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