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

Краткое руководство по использованию Keycloak с пружинным загрузчиком

Узнайте, как настроить сервер блокировки ключей и использовать его с приложением Spring Boot.

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

1. Обзор

В этой статье мы рассмотрим основы настройки сервера блокировки ключей, как подключить к нему приложение Spring Boot и как использовать его с Spring Security .

Дальнейшее чтение:

Весенняя безопасность и OpenID подключаются

Простой единый вход с помощью Spring Security OAuth2

CAS SSO С пружинной защитой

2. Что Такое Keycloak?

Keycloak-это решение для управления идентификацией и доступом с открытым исходным кодом, предназначенное для современных приложений и служб.

Keycloak предлагает такие функции, как Единый вход (SSO), Посредничество в идентификации и социальный вход, Федерация пользователей, Клиентские адаптеры, консоль администратора и Консоль управления учетными записями. Чтобы узнать больше о Keycloak, пожалуйста, посетите официальную страницу .

В нашем уроке мы будем использовать консоль администратора Keycloak для настройки, а затем подключения к Spring Boot с помощью клиентского адаптера Keycloak.

3. Настройка сервера блокировки ключей

3.1. Загрузка и установка Keycloak

Есть несколько дистрибутивов на выбор.

Однако в этом уроке мы будем использовать автономную версию.

Давайте скачаем дистрибутив Keycloak-11.0.2 Автономный сервер из официального источника.

Как только мы загрузим дистрибутив автономного сервера, мы сможем распаковать его и запустить блокировку ключей с терминала:

unzip keycloak-11.0.2.zip 
cd keycloak-11.0.2/bin
./standalone.sh -Djboss.socket.binding.port-offset=100

После запуска ./standalone.sh , Keycloak начнет свои услуги. Как только мы увидим строку , содержащую Keycloak 11.0.2 (ядро WildFly 12.0.3.Final), запущенную , мы будем знать, что запуск завершен.

Теперь давайте откроем браузер и посетим http://localhost:8180 . Мы будем перенаправлены на http://localhost:8180/auth для создания административного входа:

Давайте создадим начального администратора с именем начальный 1 с паролем zaq 1!QAZ . При нажатии Создать мы увидим сообщение Пользователь создан .

Теперь мы можем перейти к административной консоли. На странице входа в систему мы введем первоначальные учетные данные администратора:

3.2. Создание области

Успешный вход в систему приведет нас к консоли и откроет для нас область Master по умолчанию.

Здесь мы сосредоточимся на создании пользовательской области.

Давайте перейдем в верхний левый верхний угол , чтобы открыть кнопку Добавить область :

На следующем экране давайте добавим новую область под названием SpringBootKeycloak :

После нажатия кнопки Создать будет создана новая область, и мы будем перенаправлены на нее. Все операции в следующих разделах будут выполняться в этой новой области Spring Boot Keycloak .

3.3. Создание клиента

Теперь мы перейдем на страницу клиентов. Как мы можем видеть на изображении ниже, Keycloak поставляется с клиентами, которые уже встроены :

Но нам нужно добавить нового клиента в наше приложение, поэтому мы нажмем Создать . Мы вызовем нового клиента приложение для входа в систему :

На следующем экране для этого урока мы оставим все значения по умолчанию, кроме | Допустимых URI перенаправления поля. Это поле должно содержать URL-адреса приложений, которые будут использовать этот клиент для аутентификации :

Позже мы создадим приложение Spring Boot, работающее на порту 8081, которое будет использовать этот клиент. Поэтому мы использовали URL-адрес перенаправления http://localhost:8081/ * выше.

3.4. Создание роли и Пользователя

Доступ на основе ролей пользователя с ключом. Поэтому у каждого пользователя должна быть своя роль.

Для этого нам нужно перейти на страницу Роли :

Затем мы добавим пользователя роль:

Теперь у нас есть роль, которую можно назначить пользователям, но пользователей пока нет. Итак, давайте перейдем на страницу Пользователи и добавим одну:

Мы добавим пользователя с именем user1:

Как только пользователь будет создан, отобразится страница с его подробными сведениями:

Теперь мы можем перейти на вкладку Учетные данные . Мы установим первоначальный пароль на [email protected] :

Наконец, мы перейдем на вкладку Сопоставления ролей . Мы назначим роль пользователя нашему пользователю 1 :

4. Генерация токенов доступа с помощью API Keycloak

Keycloak предоставляет API REST для создания и обновления токенов доступа. Мы можем легко использовать этот API для создания вашей собственной страницы входа в систему.

Во-первых, нам нужно получить маркер доступа от Keycloak, отправив запрос POST на этот URL:

http://localhost:8180/auth/realms/SpringBootKeycloak/protocol/openid-connect/token

Запрос должен содержать это тело в формате x-www-форма-url-кодированный :

client_id:
username:
password:
grant_type:password

В ответ мы получим access_token и refresh_token .

Маркер доступа следует использовать в каждом запросе к ресурсу, защищенному паролем, просто поместив его в заголовок Авторизация :

headers: {
    'Authorization': 'Bearer' + access_token
}

Как только срок действия маркера доступа истечет, мы можем обновить его, отправив запрос POST по тому же URL-адресу, что и выше, но содержащий маркер обновления вместо имени пользователя и пароля:

{
    'client_id': 'your_client_id',
    'refresh_token': refresh_token_from_previous_request,
    'grant_type': 'refresh_token'
}

Keycloak ответит на это новым access_token и refresh_token.

5. Создание приложения для загрузки Spring

5.1. Зависимости

Последние зависимости стартового ключа для весенней загрузки можно найти на Maven Central .

Адаптер весенней загрузки Keycloak использует автоматическую конфигурацию Spring Boot , поэтому все, что нам нужно сделать, это добавить стартер весенней загрузки Keycloak в наш проект.

В XML-элементе зависимостей нам нужно следующее, чтобы запустить Keycloak с помощью Spring Boot:


    org.keycloak
    keycloak-spring-boot-starter

После XML-элемента зависимостей нам нужно указать управление зависимостями для ключевого ключа:


    
        
            org.keycloak.bom
            keycloak-adapter-bom
            11.0.2
            pom
            import
        
    

Теперь поддерживаются следующие встроенные контейнеры, которые не требуют никаких дополнительных зависимостей при использовании Spring Boot Keycloak Starter:

  • Кот
  • Подводное течение
  • Пристань

5.2. Веб-страницы Thymeleaf

Мы используем Thymeleaf для наших веб-страниц.

У нас есть три страницы:

  • external.html – внешняя веб-страница для общественности
  • customers.html – внутренняя страница, доступ к которой будет ограничен только авторизованными пользователями с ролью пользователь .
  • layout.html – простой макет, состоящий из двух фрагментов, который используется как для внешней, так и для внутренней страницы

Код для шаблонов Thymeleaf доступен на Github .

5.3. Контроллер

Веб-контроллер сопоставляет внутренние и внешние URL-адреса с соответствующими шаблонами Thymeleaf:

@GetMapping(path = "/")
public String index() {
    return "external";
}
    
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    model.addAttribute("username", principal.getName());
    return "customers";
}

Для пути /клиенты мы извлекаем всех клиентов из репозитория и добавляем результат в качестве атрибута в Модель . Позже мы повторим результаты в Thymeleaf.

Чтобы иметь возможность отображать имя пользователя, мы также вводим Принципал .

Обратите внимание, что мы используем клиента здесь только в качестве исходных данных для отображения, и ничего больше.

5.4. Конфигурация блокировки ключей

Вот базовая, обязательная конфигурация :

keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true

Как мы помним, мы запустили блокировку ключей в порту 8180 , следовательно, путь, указанный в keycloak.auth-server-url . Мы вводим имя области, которое мы создали в консоли администратора Keycloak.

Значение, указанное в keycloak.resource , соответствует клиенту, который мы назвали в консоли администратора.

Вот ограничения безопасности, которые мы будем использовать:

keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

Эти ограничения гарантируют, что каждый запрос к /клиентам/* будет авторизован только в том случае, если запрашивающий его пользователь является аутентифицированным пользователем с ролью пользователь .

Кроме того, мы можем определить keycloak.principal-атрибут как предпочтительное имя пользователя , чтобы заполнить Принципал нашего контроллера соответствующим пользователем:

keycloak.principal-attribute=preferred_username

5.5. Демонстрация

Теперь мы готовы протестировать наше приложение. Чтобы запустить приложение Spring Boot, мы можем легко запустить его через среду разработки, такую как Spring Tool Suite (STS), или выполнить эту команду в терминале:

mvn clean spring-boot:run

При посещении http://localhost:8081 мы видим:

Теперь мы нажимаем клиенты , чтобы войти в интрасеть, где находится конфиденциальная информация.

Мы видим, что нас перенаправили для аутентификации с помощью ключа, чтобы узнать, имеем ли мы право просматривать этот контент:

Как только мы войдем в систему как пользователь1 , Keycloak подтвердит нашу авторизацию – что у нас есть роль пользователя – и мы будем перенаправлены на страницу с ограниченным доступом клиенты :

Теперь мы закончили настройку подключения Spring Boot к Keycloak и продемонстрировали, как это работает.

Как мы видим, весь процесс вызова сервера авторизации Keycloak был легко обработан Spring Boot для нас. Нам не нужно было вызывать API Keycloak, чтобы самостоятельно генерировать маркер доступа, или даже отправлять заголовок авторизации явно в нашем запросе на защищенные ресурсы.

Далее мы рассмотрим, как использовать Spring Security в сочетании с нашим существующим приложением.

6. Весенняя Безопасность

Существует адаптер безопасности Keycloak Spring, и он уже включен в нашу зависимость от запуска Spring Boot Keycloak . Теперь мы рассмотрим, как интегрировать Spring Security с Keycloak.

6.1. Зависимость

Чтобы использовать Spring Security с Spring Boot, мы должны добавить эту зависимость:


    org.springframework.boot
    spring-boot-starter-security
    2.2.6.RELEASE

Последнюю версию системы безопасности Spring Boot Starter можно найти на Maven Central .

6.2. Класс конфигурации

Брелок обеспечивает Адаптер_конфигурации ключей безопасности в качестве удобного базового класса для создания WebSecurityConfigurer пример.

Это полезно, поскольку для любого приложения, защищенного Spring Security, требуется класс конфигурации, расширяющий WebSecurityConfigurerAdapter:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(
      AuthenticationManagerBuilder auth) throws Exception {
 
        KeycloakAuthenticationProvider keycloakAuthenticationProvider
          = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
          new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
          new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
          .antMatchers("/customers*")
          .hasRole("user")
          .anyRequest()
          .permitAll();
    }
}

В приведенном выше коде метод configure Global() задает Простой сопоставитель полномочий , чтобы убедиться, что роли не имеют префикса ROLE_.

Другой метод, распознаватель конфигурации keycloak определяет, что мы хотим использовать поддержку файла свойств загрузки Spring вместо keycloak.json по умолчанию.

Поскольку мы настроили ограничения безопасности с помощью Spring Security, мы можем удалить или прокомментировать эти ограничения безопасности, которые мы ранее разместили в файле свойств:

#keycloak.security-constraints[0].authRoles[0]=user
#keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

Теперь, после аутентификации, мы сможем получить доступ к странице внутренних клиентов, как и раньше.

7. Заключение

В этом руководстве мы настроили сервер блокировки ключей и использовали его с приложением Spring Boot.

Мы также видели, как настроить защиту Spring и использовать ее в сочетании с Keycloak. Рабочая версия кода, показанного в этой статье, доступна на Github .