Я использую 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?
Вам нужно сначала запросить токен у клиента 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 для
ID
;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, о котором вы упоминаете, было альтернативным решением, которое я написал, я просто обновляю ответ, чтобы явно указать конечную точку.