Подтвердить что ты не робот

Keycloak извлекает пользовательские атрибуты для KeycloakPrincipal

В моей службе отдыха я могу получить основную информацию после аутентификации с помощью

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();

утверждение.

Keycloak main does'nt котирует всю информацию, которая мне нужна об аутентифицированном пользователе. Можно ли настроить собственный основной тип? На сервере keycloak-server я разработал провайдер федерации пользователей. Я видел, что UserModel позволяет добавить набор пользовательских атрибутов моему пользователю.

Возможно ли вставить мой пользовательский принцип в этот код?

Можно ли извлекать эти атрибуты из принципала keycloak?

Каким образом?

4b9b3361

Ответ 1

Чтобы добавить пользовательские атрибуты, вам нужно сделать три вещи:

  1. Добавить атрибуты в консоль администратора
  2. Добавить сопоставление претензий
  3. Заявки на доступ

Первый объясняется довольно хорошо здесь: https://www.keycloak.org/docs/latest/server_admin/index.html#user-attributes

Добавить сопоставление претензий:

  1. Откройте консоль администратора своего царства.
  2. Зайдите в Клиенты и откройте ваш клиент
  3. Это работает только для Настройки> Тип доступа, конфиденциальный или общедоступный (не только для канала-носителя)
  4. Перейти к картостроителям
  5. Создайте отображение из вашего атрибута в JSON
  6. Поставьте галочку "Добавить в 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" из группы (что имеет смысл)