簡體   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