Keycloak REST API не удается удалить роли уровня клиента из сопоставления ролей пользователей

Надеюсь, что кто-то может мне помочь в этом. Я создал свой собственный мир Keycloak и клиента. Я использую загрузку Spring и KeycloakRestTemplate из org.keycloak.adapters.springsecurity.client.KeycloakRestTemplate; делать все мои звонки.

Мне удалось добавить роли клиентского уровня в сопоставление ролей любого пользователя.

Я добавляю к своему URI префикс / admin / realms / при использовании документации API Keycloak. Пока все мои запросы работали (получение списка пользователей от моего клиента, получение списка пользователей с определенной ролью на уровне клиента и даже добавление ролей на уровне клиента пользователю, как описано выше)

Моя проблема в том, что я не могу удалить роли клиентского уровня от пользователя. Я просмотрел документы 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-b786ca3a44a

Ошибка при вызове API удаления: org.springframework.web.client.HttpClientErrorException $ UnsupportedMediaType: 415 Неподдерживаемый тип мультимедиа: [{ошибка: RESTEASY003065: невозможно использовать тип содержимого}]

Изменить 1: Я также заранее предоставил себе ВСЕ доступные роли от всех клиентов в качестве меры предосторожности. Я понимаю, что некоторые роли необходимы для выполнения определенных задач даже через API. Я учел это.


person Ali_Ahmed    schedule 22.06.2021    source источник
comment
Думали ли вы об установке значения application / json в качестве типа содержимого?   -  person botscripter    schedule 23.06.2021
comment
Благодарю за ваш ответ! @rimesc решил мою проблему ниже. Согласно классу KeycloakRestTemplate, все его методы унаследованы от Spring RestTemplate, и главное преимущество использования этого класса над SpringTemplate ‹code› RestTemplate ‹/code› заключается в том, что аутентификация обрабатывается автоматически, когда и служба, выполняющая вызов API, и служба, являющаяся вызываемые защищены аутентификацией Keycloak. поэтому я считаю, что этот класс автоматически добавляет заголовок application / json при каждом запросе.   -  person Ali_Ahmed    schedule 24.06.2021


Ответы (1)


KeycloakRestTemplate похоже наследует все свои методы непосредственно от Spring RestTemplate. Согласно документация для этого класса, второй аргумент delete не является телом запроса, как я думаю, вы намереваетесь. Скорее, это набор объектов, используемых для раскрытия переменных шаблона в URI.

Похоже, что не существует варианта метода delete, позволяющего предоставить тело, поэтому вам, вероятно, придется использовать один из вариантов методов execute или exchange, который вместо этого принимает метод HTTP и объект запроса. Фактически, RestTemplate API делает это довольно трудным, потому что обычно предполагается, что DELETE запросы не имеют тела.

person rimesc    schedule 22.06.2021
comment
Большое спасибо!! Вы попали в точку :) Я последовал вашему совету и использовал метод обмена, так как у меня было тело запроса для моего запроса на удаление, и оно было успешно выполнено! HttpEntity<List<RoleRepresentation>> request = new HttpEntity<List<RoleRepresentation>>(deleteRolesList); this.restTemplate.exchange(builder.toUriString(), HttpMethod.DELETE, request, List.class); - person Ali_Ahmed; 24.06.2021