Keycloak извлекает пользовательские атрибуты для KeycloakPrincipal
В моей службе отдыха я могу получить основную информацию после аутентификации с помощью
KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
утверждение.
Keycloak main does'nt котирует всю информацию, которая мне нужна об аутентифицированном пользователе.
Можно ли настроить собственный основной тип?
На сервере keycloak-server я разработал провайдер федерации пользователей. Я видел, что UserModel позволяет добавить набор пользовательских атрибутов моему пользователю.
Возможно ли вставить мой пользовательский принцип в этот код?
Можно ли извлекать эти атрибуты из принципала keycloak?
Каким образом?
Ответы
Ответ 1
Чтобы добавить пользовательские атрибуты, вам нужно сделать три вещи:
- Добавить атрибуты в консоль администратора
- Добавить сопоставление претензий
- Заявки на доступ
Первый объясняется довольно хорошо здесь: https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes
Добавить сопоставление претензий:
- Откройте консоль администратора своего царства.
- Зайдите в Клиенты и откройте ваш клиент
- Это работает только для Настройки> Тип доступа, конфиденциальный или общедоступный (не только для канала-носителя)
- Перейти к картостроителям
- Создайте отображение из вашего атрибута в JSON
- Поставьте галочку "Добавить в ID токен"
Заявки на доступ:
final Principal userPrincipal = httpRequest.getUserPrincipal();
if (userPrincipal instanceof KeycloakPrincipal) {
KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
IDToken token = kp.getKeycloakSecurityContext().getIdToken();
Map<String, Object> otherClaims = token.getOtherClaims();
if (otherClaims.containsKey("YOUR_CLAIM_KEY")) {
yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
}
} else {
throw new RuntimeException(...);
}
Надеюсь, что это помогает и подходит для вашего случая использования. Я использовал это для пользовательского атрибута, который я добавил с пользовательской темой.
Ответ 2
-
Выберите "Пользователи"> "Поиск"> щелкните по идентификатору> перейдите на вкладку "Атрибуты"> "Добавить атрибут", например: "Телефон"> "Сохранить" ![enter image description here]()
-
Выберите Клиенты> нажмите на Идентификатор клиента> перейдите на вкладку Mappers> создать маппер
![enter image description here]()
![enter image description here]()
![enter image description here]()
-
Получить пользовательские атрибуты
![enter image description here]()
![enter image description here]()
ОБНОВИТЬ
-
Добавьте атрибут "телефон" на уровне группы, назначьте пользователя в эту группу, и вы получите атрибут "телефон" на уровне группы для всех пользователей.
-
Вернитесь к мапперу и обновите "phone", указав "Aggregate attribute values = true" и "Multivalued = true", и вы получите "phone" в виде списка с атрибутами как на уровне группы, так и на уровне пользователя. Если вы оставите "Aggregate attribute values = false" или "Multivalued = false", вы получите только одно значение, где атрибут "phone" от пользователя будет переопределять атрибут "phone" из группы (что имеет смысл)