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



希望有人能帮我。我创建了我自己的钥匙斗篷王国和客户。我使用的是org.keyclock.adapters.springsecurity.client.KeyclockRestTemplate中的Spring引导和KeyclockrestTemplate;打我所有的电话。

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

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

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

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

"从用户角色映射中删除客户端级别的角色删除/{领域}/用户/{id}/角色映射/客户端/{客户端}";

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-59f44-4406-9527-2a59ee0c3751/角色映射/客户端/53e659e1-7cef-4db-8cdd-b786ca3a44a4

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

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

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

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

与Key斗篷交互的另一种方式可以是使用key斗篷启动器依赖项和key斗篷管理客户端。

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

  2. 配置Key斗篷管理员用户。

    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);

最新更新