Spring Boot+Keycloak от нуля до единицы
Spring Boot+Keycloak от нуля до единицы
Исходная ссылка: https://www.baeldung.com/spring-boot-keycloak.

Автор: Майкл Гуд

Переводчик: helloworldtang

1. Обзор

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

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

Keycloak — это решение IAM (управление идентификацией и доступом) с открытым исходным кодом для современных приложений и сервисов.

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

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

3. Установите и настройте сервер Keycloak.

3.1 Загрузите и установите Кейклоак.

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

Загрузите Keycloak-3.3.0.Final Standalone Server Release из официальных источников.

Скачав дистрибутив автономного сервера, разархивируем его и запускаем Keycloak в локальном терминале:

Язык кода:javascript
копировать
unzip keycloak-3.3.0.Final.zip
cd keycloak-3.3.0.Final/bin
./standalone.sh -Djboss.socket.binding.port-offset=100

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

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

Давайте создадим пользователя с именем «initial1» и паролем «zaq1!QAZ». Теперь мы видим страницу «Добро пожаловать в Keycloak»:

Теперь мы можем продолжить работу над консолью управления.

3.2. Создать Царство

Наведем мышкой в ​​левый верхний угол и найдем кнопку «Добавить область»:

Мы назвали его «SpringBootKeycloak»:

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

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

Нам нужно добавить клиента в приложение, поэтому нажимаем «Создать». Настраиваем новый идентификатор клиента как «login-app»:

На следующей странице в этом руководстве мы сохраним все значения по умолчанию, кроме поля «Действительные URI перенаправления». После настройки вы будете перенаправлены на порт 8081:

3.4. Создайте роль и пользователя.

Keycloak использует ролевую основу Доступ. Поэтому у каждого пользователя должна быть своя роль. Нам нужно перейти на страницу «Роль»:

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

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

Создаем пользователя «user1»:

Если пользователь создан, информация о пользователе будет отображаться здесь:

Теперь мы можем перейти на вкладку «Учетные данные» и установить пароль «xsw2@WSX»:

Переходим на вкладку «Сопоставление ролей» и назначаем роли пользователей:

4. Создайте приложение Spring Boot.

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

Найдите последнюю версию зависимости Spring Boot Keycloak Starter в Maven Central.

Адаптер Spring Boot Keycloakоснован на Автоматическая настройка Spring Boot,Итак, все, что нам нужно сделать, это установить Keycloak Spring Boot, добавленный в наш проект.

Если вы хотите использовать Keycloak в проекте Spring Boot, нам нужно добавить следующие зависимости в файл pom.xml:

Язык кода:javascript
копировать
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>

В дополнение к этому нам также необходимо указать DependencyManagement Keycloak:

Язык кода:javascript
копировать
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>3.3.0.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

  • Tomcat
  • Undertow
  • Jetty

4.2. Веб-страница Тимелеаф.

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

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

Код, относящийся к шаблонам Thymeleaf, был размещен на Github.

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

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

Язык кода:javascript
копировать
@GetMapping(path = "/")
public String index() {
    return "external";
}

@GetMapping(path = "/customers")
public String customers(Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    return "customers";
}

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

4.4. Конфигурация клоака.

Ниже приведены основные свойства, которые необходимо настроить:

Язык кода:javascript
копировать
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true

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

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

Язык кода:javascript
копировать
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

Ограничения безопасности, настроенные выше, гарантируют, что только прошедшие проверку подлинности пользователи с ролью «пользователь» смогут получить доступ к /customers/*.

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

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

Язык кода:javascript
копировать
mvn clean spring-boot:run

Заходим на localhost:8080:

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

Как видите, нас перенаправили в Keycloak для аутентификации, и нам нужно проверить, авторизован ли текущий пользователь для просмотра этого контента:

Если мы прошли аутентификацию и прошли проверку авторизации Keycloak, мы будем перенаправлены на страницу клиентов с ограниченным доступом:

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

Теперь мы обсудим, как использовать Spring Security с существующими приложениями.

5. Spring Security

Уже включено в Spring Boot Keycloak Starterполагаться.одинKeycloak Spring Адаптер безопасности. Теперь давайте посмотрим, как использовать Spring Интеграция безопасности и Keycloak.

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

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

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>1.5.3</version>
</dependency>

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

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

Keycloak предоставляет удобный базовый класс KeycloakWebSecurityConfigurerAdapter для создания экземпляров WebSecurityConfigurer, поскольку для любого приложения, защищенного Spring Security, требуется класс конфигурации, расширяющий WebSecurityConfigurerAdapter:

Язык кода:javascript
копировать
@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();
    }
}

Обратите внимание на код выше:

  • configureGlobal: выполните задачу SimpleAuthorityMapper, чтобы убедиться, что роли не имеют префикса ROLE_.
  • keycloakConfigResolver: определяет поддержку файла свойств Spring Boot, который мы хотим использовать вместо keycloak.json по умолчанию.

5.3. application.properties

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

Язык кода:javascript
копировать
keycloak.principal-attribute=preferred_username

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

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

Язык кода:javascript
копировать
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model){
    addCustomers(); 
    model.addAttribute("customers", customerDAO.findAll());
    model.addAttribute("username", principal.getName());
    return "customers";
}

5.5. Thymeleaf

Внутри тега div мы добавим такое приветствие:

Язык кода:javascript
копировать
<h1>Hello, <span th:text="${username}">--name--</span>.</h1>

5.6. Demo

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

6 Резюме

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

Мы также увидели, как настроить Spring Security и использовать его с сервером Keycloak. Код, использованный в этой статье, можно найти на Github.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose