Keycloak получает настраиваемые атрибуты в KeycloakPrincipal

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

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

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

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

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

Можно ли получить эти атрибуты от принципала keycloak?

Какой способ?


person Alex    schedule 20.09.2015    source источник
comment
stackoverflow.com/ questions / 29014894 /   -  person Vítor    schedule 29.09.2015


Ответы (2)


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

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

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

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

  1. Откройте консоль администратора вашего игрового мира.
  2. Перейдите в раздел Клиенты и откройте своего клиента
  3. Это работает только для Настройки> Тип доступа: конфиденциальный или общедоступный (не только на предъявителя).
  4. Перейти к картографам
  5. Создайте сопоставление вашего атрибута с json
  6. Установите флажок «Добавить в токен идентификатора».

Заявки на доступ:

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(...);
}

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

person lisa p.    schedule 01.10.2015
comment
Я могу получить идентификатор электронной почты, GivenName, Family Name, но не могу получить пользовательский атрибут mobile. Я получаю OtherClaims с размером 0. - person Surya Movva; 12.10.2017
comment
Мой код: KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) запрос. getUserPrincipal (); KeycloakPrincipal Principal = (KeycloakPrincipal) token.getPrincipal (); IDToken idToken = принципал.getKeycloakSecurityContext (). GetIdToken (); System.err.println (размер + otherClaims.size () + idToken.getEmail () + idToken.getFamilyName ()); - person Surya Movva; 12.10.2017
comment
@SuryaMovva, вы добавили сопоставления в консоли администрирования keycloak под клиентом, который вы используете? - person Turbut Alin; 25.10.2017
comment
@TurbutAlin Привет. У меня точно такая же проблема. Я не вижу новых атрибутов, добавленных к пользователю. Я добавил сопоставление под свой клиент (приложение для весенней загрузки), но новые атрибуты все еще не получены. Не могли бы вы помочь? Спасибо - person troger19; 06.12.2017
comment
Ссылка устарела, правильная - keycloak.org/docs/latest / server_admin / - person lkamal; 09.10.2018

  • Выберите Пользователи> Поиск> щелкните идентификатор> перейдите на вкладку атрибутов> Добавить атрибут> например: телефон> Сохранить введите описание изображения здесь

  • Выберите «Клиенты»> щелкните «Идентификатор клиента»> перейдите на вкладку «Картографы»> «Создать сопоставитель».

    введите описание изображения здесь

    введите описание изображения здесь

    введите описание изображения здесь

  • Получить настраиваемые атрибуты

    введите описание изображения здесь

    введите описание изображения здесь

ОБНОВИТЬ

  • Добавьте атрибут «телефон» на уровне группы, назначьте пользователя этой группе, и вы получите атрибут «телефон» на уровне группы для всех пользователей.

  • Вернитесь к картографу и обновите 'phone', указав 'Aggregate attribute values ​​= true' и 'Multivalued = true', и вы получите 'phone' в виде списка с атрибутами как на уровне группы, так и на уровне пользователя. Если вы сохраните 'Совокупные значения атрибутов = false' или 'Multivalued = false', вы получите только одно значение, где атрибут 'phone' от пользователя будет переопределять атрибут 'phone' из группы (что имеет смысл)

person Neeraj Benjwal    schedule 06.12.2017
comment
Спасибо, @Neeraj, я делал то же самое, что и ты. Проблема с моей стороны заключалась в кешировании. После добавления сопоставления или атрибута пользователя мне нужно очистить кеш области в консоли администратора Keycloak. Впоследствии я смог увидеть атрибуты и в других претензиях. Надеюсь, это поможет всем. - person troger19; 07.12.2017
comment
@ troger19 Спасибо за этот комментарий, я потратил много часов, потому что не думал об этом. - person Neikius; 18.12.2017
comment
Спасибо за решение. Есть ли способ применить настраиваемые атрибуты ко всем пользователям? Мне особенно нужно сделать это для всех моих пользователей, импортированных через моего провайдера Ldap. - person user1026498; 02.03.2018
comment
Спасибо за решение! Делали то, что хотели! Обновлен ваш ответ с параметрами групповых атрибутов - person Dmitri Algazin; 17.07.2019
comment
Я новичок в KeyCloak и использую последнюю версию 6.0.1. Ваш ответ был таким посланным Богом - ясным, кратким и правильным! Спасибо. Престижность !! - person sunitkatkar; 04.08.2019
comment
@Neeraj Для мобильного приложения я хочу сохранять идентификатор устройства, модель_устройства, широту и долготу при входе в систему через RESTAPI (/ openid-connect / token). Keycloak это поддерживает? - person Panup Pong; 26.08.2019