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

时间:2021-06-22 18:27:53

标签: java spring-boot keycloak keycloak-rest-api

希望有人能帮我解决这个问题。我已经创建了自己的 Keycloak Realm 和客户端。我正在使用来自 org.keycloak.adapters.springsecurity.client.KeycloakRestTemplate 的 Spring boot 和 KeycloakRestTemplate;拨打我所有的电话。

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

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

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

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-84a3c >

调用删除 API 时出错:org.springframework.web.client.HttpClientErrorException$UnsupportedMediaType:415 不支持的媒体类型:[{"error":"RESTEASY003065: 无法使用内容类型"}]

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

1 个答案:

答案 0 :(得分:0)

KeycloakRestTemplate appears to inherit 它的所有方法都直接来自 Spring 的 RestTemplate。根据该类的 documentationdelete 的第二个参数不是请求正文,正如我认为您的意图。相反,它是用于扩展 URI 中的模板变量的对象的可变参数。

似乎没有 delete 方法的变体允许您提供主体,因此您可能需要使用 execute 或 {{ 1}} 接受 HTTP 方法和请求实体的方法。事实上,exchange API 使这很难做到,因为通常假设 RestTemplate 请求没有正文。