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 .