1. Обзор
Кейклак — сторонний сервер авторизации, управляющий пользователями наших веб-приложений или мобильных приложений.
Он предлагает некоторые атрибуты по умолчанию, такие как имя, фамилия и электронная почта, которые будут храниться для любого пользователя. Но много раз, это не достаточно, и мы, возможно, потребуется добавить некоторые дополнительные атрибуты пользователя, характерные для нашего приложения.
В этом учебнике мы увидим как мы можем добавить пользовательские атрибуты пользователя на наш сервер авторизации Keycloak и получить к ним доступ в резервном приложении на основе .
Сначала мы увидим это для автономного сервера Keycloak, а затем для встроенного.
2. Автономный сервер
2.1. Добавление пользовательских атрибутов пользователя
Первым шагом здесь является перейти к консоли администратора Keycloak. Для этого нам нужно будет начать сервер, вытехав эту команду из системы распределения Keycloak бен папка:
./standalone.sh -Djboss.socket.binding.port-offset=100
Тогда нам нужно идти в администратор консоли и ключ в начальная1 / zaq1! ЗАЗ верительные грамоты.
Далее мы нажимаем на Пользователи под Управление вкладка, а затем Просмотр всех пользователей :
Здесь мы можем увидеть пользователь, которого мы добавили ранее : user1 .
Теперь давайте нажимаем на его Идентификационный и пойти в Атрибуты вкладка, чтобы добавить новый, DOB для даты рождения:
После нажатия Сохранить , пользовательский атрибут добавляется к информации пользователя.
Далее нам нужно добавить отображение для этого атрибута в качестве пользовательского требования, чтобы оно было доступно в полезной нагрузке JSON для токена пользователя.
Для этого нам нужно зайти к клиенту нашего приложения на консоль администратора. Напомним, что ранее мы создали клиент, логин-приложение:
Теперь давайте нажимаем на него и перейдите к его Мапперы вкладка для создания нового отображения:
Во-первых, мы выберем Mapper Тип как Пользователь Атрибут а затем установить Название , Пользователь Атрибут , и Название претензии токена как DOB . Претензия JSON Тип должны быть установлены в Струнные .
При нажатии Сохранить , наше отображение готово. Так что теперь, мы оборудованы от конца Keycloak для получения DOB в качестве пользовательского атрибута пользователя.
В следующем разделе Мы увидим, как получить к нему доступ через систему вызова .
2.2. Доступ к пользовательским атрибутам пользователя
Опираясь на наше приложение Spring Boot, давайте добавим новый контроллер REST, чтобы получить атрибут пользователя, который мы добавили:
@Controller public class CustomUserAttrController { @GetMapping(path = "/users") public String getUserInfo(Model model) { KeycloakAuthenticationToken authentication = (KeycloakAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); Principal principal = (Principal) authentication.getPrincipal(); String dob=""; if (principal instanceof KeycloakPrincipal) { KeycloakPrincipal kPrincipal = (KeycloakPrincipal) principal; IDToken token = kPrincipal.getKeycloakSecurityContext().getIdToken(); MapcustomClaims = token.getOtherClaims(); if (customClaims.containsKey("DOB")) { dob = String.valueOf(customClaims.get("DOB")); } } model.addAttribute("username", principal.getName()); model.addAttribute("dob", dob); return "userInfo"; } }
Как видим, здесь мы впервые получили KeycloakАунтикацияТокен из контекста безопасности, а затем извлекли Главный от него. После литья его в качестве KeycloakПринципиальная , мы получили его IDТокен .
DOB могут быть извлечены из этого IDТокен ‘ы ДругиеКлаймс .
Вот шаблон, названный userInfo.html, которые мы будем использовать для отображения этой информации:
Hello, --name--.
Your Date of Birth as per our records is .
2.3. Тестирование
При запуске приложения Boot мы должны перейти к http://localhost:8081/users . Сначала нас попросят ввести учетные данные.
После входа user1 ‘S полномочия, мы должны увидеть эту страницу:
3. Встроенный сервер
Теперь давайте посмотрим, как достичь того же на встроенном экземпляре Keycloak.
3.1. Добавление пользовательских атрибутов пользователя
В принципе, мы должны сделать те же шаги здесь, только то, Мы должны спасти их, как предварительной конфигурации в нашем файле определения сферы, baeldung-realm.json .
Чтобы добавить атрибут DOB для наших пользователей (электронная почта защищена) , во-первых, мы должны настроить его атрибуты:
"attributes" : { "DOB" : "1984-07-01" },
Затем добавьте картограф протокола для DOB :
"protocolMappers": [ { "id": "c5237a00-d3ea-4e87-9caf-5146b02d1a15", "name": "DOB", "protocol": "openid-connect", "protocolMapper": "oidc-usermodel-attribute-mapper", "consentRequired": false, "config": { "userinfo.token.claim": "true", "user.attribute": "DOB", "id.token.claim": "true", "access.token.claim": "true", "claim.name": "DOB", "jsonType.label": "String" } } ]
Это все, что нам здесь нужно.
Теперь, когда мы увидели, что сервер авторизации является частью добавления пользовательского атрибута пользователя, пришло время посмотреть, как ресурсный сервер может получить доступ к DOB .
3.2. Доступ к пользовательским атрибутам пользователя
На стороне ресурсного сервера пользовательские атрибуты будут просто доступны нам в качестве значений претензий в АутентификацияПринципиальная .
Давайте закомим API для него:
@RestController public class CustomUserAttrController { @GetMapping("/user/info/custom") public MapgetUserInfo(@AuthenticationPrincipal Jwt principal) { return Collections.singletonMap("DOB", principal.getClaimAsString("DOB")); } }
3.3. Тестирование
Теперь давайте проверить его с помощью JUnit.
Сначала нам нужно получить токен доступа, а затем позвонить в /пользователь/инфо/пользовательский Конечная точка API на ресурсном сервере:
@Test public void givenUserWithReadScope_whenGetUserInformationResource_thenSuccess() { String accessToken = obtainAccessToken("read"); Response response = RestAssured.given() .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) .get(userInfoResourceUrl); assertThat(response.as(Map.class)).containsEntry("DOB", "1984-07-01"); }
Как мы видим, здесь мы проверили, что мы получаем то же самое DOB значение, которое мы добавили в атрибуты пользователя .
4. Заключение
В этом учебнике мы научились добавлять дополнительные атрибуты пользователю в Keycloak.
Мы видели это как для автономного, так и для встроенного экземпляра. Мы также видели, как получить доступ к этим пользовательским претензиям в API REST на бэкэнде в обоих сценариях.
Как всегда, исходный код доступен на GitHub. Для автономного сервера, он находится на учебники GitHub , и для встроенного экземпляра, на OAuth GitHub .