Keycloak REST API 无法从用户角色映射中删除客户端级角色

Posted

技术标签:

【中文标题】Keycloak REST API 无法从用户角色映射中删除客户端级角色【英文标题】:Keycloak REST API Unable to Delete client-level roles from user role mapping 【发布时间】:2021-09-06 08:53:45 【问题描述】:

希望有人可以帮助我。我创建了自己的 Keycloak Realm 和客户端。我正在使用来自 org.keycloak.adapters.springsecurity.client.KeycloakRestTemplate 的 Spring boot 和 KeycloakRestTemplate;拨打我所有的电话。

我已成功地将客户端级角色添加到任何给定用户的用户角色映射中。

在使用 Keycloak API 文档时,我的 URI 前缀为 /admin/realms/。到目前为止,我的所有请求都已成功(从我的客户端获取用户列表,获取具有特定客户端级角色的用户列表,甚至如上所述向用户添加客户端级角色)

我的问题是我无法删除用户的客户端级角色。我查看了 keycloak 文档,看起来我已经正确地遵循了所有内容。我还确保用户具有可删除的适用客户角色。我非常感谢任何 cmets 或提供的帮助!

https://www.keycloak.org/docs-api/14.0/rest-api/index.html

"从用户角色映射中删除客户端级角色 删除 /realm/users/id/role-mappings/clients/client"

import org.keycloak.adapters.springsecurity.client.KeycloakRestTemplate;

.
.
.


    @Autowired
        private KeycloakRestTemplate restTemplate;
.
.
.
.
.


UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(keycloakServerUrl + "/admin/realms/"+keycloakRealm+"/users/"+userId+"/role-mappings/clients/"+keycloakClientId);

this.restTemplate.postForEntity(builder.toUriString(), rolesList, List.class);  // this works! Note: rolesList is an List<RoleRepresentation> object

.
.
.

this.restTemplate.delete(builder.toUriString(), rolesList); // Does not work!

URI:http://XXXXXXXXXXXXXXX:8180/auth/admin/realms/VLS/users/2144cc43-59f4-4406-9527-2a59ee0c3751/role-mappings/clients/53e659e1-7cef-4dbb-8cdd-b786ca3a44a4

调用 Delete API 时出错:org.springframework.web.client.HttpClientErrorException$UnsupportedMediaType: 415 Unsupported Media Type: ["error":"RESTEASY003065: Cannot consume content type"]

编辑 1:作为预防措施,我还为自己提供了所有客户的所有可用角色。我知道即使通过 API 也需要一些角色来执行某些任务。我已经考虑到了这一点。

【问题讨论】:

只是一个快速的想法,您是否考虑过将 application/json 值设置为内容类型? 感谢您的回复! @rimesc 在下面解决了我的问题。根据 KeycloakRestTemplate 类,它的所有方法都是从 Spring 的 RestTemplate 继承的,并且“使用这个类而不是 Spring 的 RestTemplate 的主要优点是,当进行 API 调用的服务和服务都自动处理身份验证被调用的受 Keycloak 身份验证保护。”所以我相信这个类会自动在每个请求中附加 application/json 标头。 【参考方案1】:

KeycloakRestTemplateappears to inherit它的所有方法都直接来自Spring的RestTemplate。根据该类的documentation,delete 的第二个参数不是请求正文,正如我认为您想要的那样。相反,它是一个可变参数对象,用于在 URI 中扩展模板变量。

似乎没有允许您提供主体的 delete 方法的变体,因此您可能需要使用接受的 executeexchange 方法的变体之一一个 HTTP 方法和一个请求实体。事实上,RestTemplate API 让这变得非常困难,因为通常假设 DELETE 请求没有正文。

【讨论】:

非常感谢!!你一针见血:)我听从了你的建议并使用了交换方法,因为我的删除请求有一个请求正文,并且它成功通过了! HttpEntity&lt;List&lt;RoleRepresentation&gt;&gt; request = new HttpEntity&lt;List&lt;RoleRepresentation&gt;&gt;(deleteRolesList); this.restTemplate.exchange(builder.toUriString(), HttpMethod.DELETE, request, List.class);

以上是关于Keycloak REST API 无法从用户角色映射中删除客户端级角色的主要内容,如果未能解决你的问题,请参考以下文章

如何激活keycloak的REST API?

哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?

如何通过 REST API 将 Keycloak 领域角色添加到组

如何使用 httppost/rest-api 从 keycloak 获取用户列表

与 Keycloak 身份验证插件集成时,无法从 rest 客户端调用 nuxeo rest api

如何从 Keycloak REST API 获取用户?