![](/img/trans.png)
[英]how to get user Roles and client roles when authenticate from keycloak
[英]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 也需要一些角色来执行某些任务。 我已经考虑到了这一点。
与 Keycloak 交互的另一种方法是使用keycloak starter 依赖项和keycloak 管理客户端。
添加上面提到的依赖项。
配置 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.