Рубрики
Без рубрики

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

Узнайте, как добавить дополнительные атрибуты пользователю в Keycloak.

Автор оригинала: baeldung.

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

            Map customClaims = 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 Map getUserInfo(@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 .