繁体   English   中英

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

[英]Keycloak REST API Unable to Delete client-level roles from user role mapping

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

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

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

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

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

“从用户角色映射删除客户端级角色 DELETE /{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

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

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

KeycloakRestTemplate 似乎直接从 Spring 的RestTemplate 继承了它的所有方法。 根据该类的文档delete的第二个参数不是请求正文,正如我认为您的意图。 相反,它是用于扩展 URI 中的模板变量的对象的可变参数。

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

与 Keycloak 交互的另一种方法是使用keycloak starter 依赖项和keycloak 管理客户端

  1. 添加上面提到的依赖项。

  2. 配置 Keycloak 管理员用户。

     public Keycloak getAdminKeycloakUser() { return KeycloakBuilder.builder() .serverUrl(keycloakAuthUrl) .grantType(OAuth2Constants.PASSWORD) .realm(masterRealm).clientId(masterClient) .username(adminUsername).password(adminPassword) .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()) .build(); }

使用此管理员用户,我们可以删除客户端用户以及其他操作。

getAdminKeycloakUser().realm(realm).clients().roles().deleteRole(roleName);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM