Keycloak: не удается прочитать роли пользователей в качестве администратора cli при вызове API-интерфейса администратора

Я использую keycloak 11 в качестве провайдера openid для своих сервисов весенней загрузки. Пока все работает нормально.

Проблема:

У меня есть служба, которая использует веб-клиент. Он вложен в мой сервис и использует клиентскую аутентификацию с клиентом admin-cli. Это работает. Когда я получаю /users/userId, я получаю представление пользователя. Проблема, с которой я столкнулся сейчас, заключается в том, что роли пользователя Realm не добавляются в представление.

В документации этот параметр упоминается как String [] и помечен как необязательный в UserRepresentation.

Я подумал, что если я настрою Service account roles -> Client Roles -> realm-management -> realmAdmin, клиент сможет просматривать весь вывод пользователя.

Но если я использую postman и вызываю API как ali-admin, он не включается в ответ JSON.

Я также попытался добавить атрибут в свой KeycloakUserRepresentationModel.

public class KeycloakUserRepresentation {

    private String id;
    private String username;
    private String firstName;
    private String lastName;
    private String email;
    private Boolean emailVerified;
    private Boolean enabled;
    private Map<String, List<String>> attributes;
    private String[] realmRoles;

и выполнить запрос. Массив realmRoles всегда равен нулю.

Можете ли вы сказать мне, что мне нужно настроить, чтобы читать realmRoles пользователей как admin-cli?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
3 362
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно сначала запросить токен у клиента admin-cli от имени admin (или пользователя с аналогичными привилегиями):

curl    -d "client_id=admin-cli" \
        -d "username=$ADMIN_NAME" \
        -d "password=$ADMIN_PASSWORD" \
        -d "grant_type=password" \
        https://$KEYCLOAK_IP/auth/realms/master/protocol/openid-connect/token

затем, чтобы получить список пользователей, связанных с данной ролью области, вы используете этот токен при вызове следующей конечной точки:

GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/roles/<ROLE_NAME>/users

Из ответа JSON вы можете проверить, принадлежит ли ваш пользователь к этому списку.

Кроме того, вы можете вызвать Rest Admin API для

  1. получить пользователя, а затем извлечь его ID;
  2. получить роли, связанные с этим пользователем, используя его ID в вызове конечной точки: GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/users/<USER_ID>/role-mappings

Я узнал, что есть два способа сделать это.

Во-первых: URL dreamcrash упоминается:

GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/roles/<ROLE_NAME>/users

Здесь вы получаете всех пользователей с запрошенной ролью.

Второй:

GET <KEYCLOAK_HOST>/auth/admin/realms/<YOUR_REALM>/users/<USER_ID>/role-mappings

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

Я думаю, что решение 2 — лучший подход, потому что вы загружаете информацию только для конкретного пользователя. Решение 1 загружает всех пользователей и всю информацию об их учетных записях. Это может привести к снижению производительности.

Чего я не понимаю, так это того, что общая конечная точка /users/id не возвращает большинство необязательных параметров в объекте ответа UserRepresentation. Я думаю, что это так раздражает всегда находить маршрут где-то в документах. Я знаю, что это проект с открытым исходным кодом, но я думаю, что это должно быть исправлено или, по крайней мере, объяснено, как настроить keycloak для получения информации.

Да, это очень раздражает. Но, с другой стороны, иногда вам просто нужны пользователи без всех ролей. Кстати, решение 2, о котором вы упоминаете, было альтернативным решением, которое я написал, я просто обновляю ответ, чтобы явно указать конечную точку.

dreamcrash 15.12.2020 08:16

О, извините, я пропустил это. Еще раз спасибо за решение.

FishingIsLife 15.12.2020 09:14

Другие вопросы по теме