Как сохранить области, пользователей и роли в Keycloak при использовании Docker и Docker Compose для его запуска

У меня есть Java-приложение Spring Boot, которое использует Keycloak для аутентификации и авторизации. Я создал свою сферу, ее пользователей и роли. Я хочу закрепить приложение с помощью Docker Compose. Итак, я создал образ моего Java-приложения в докере. Но когда я захочу создать экземпляр Keycloak (извлекая образ Keyckloak из dockerhub), я потеряю свои постоянные области, пользователей и роли, которые я создал ранее, поскольку он создает новый Keycloak из извлеченного образа Docker. Как сохранить эти данные каждый раз, когда я запускаю приложение с помощью Docker Compose? На самом деле мне нужно, чтобы данные Keycloak (области, пользователи и роли) инициализировались автоматически всякий раз, когда я запускаю Docker Compose.

Обновлять:

Позвольте мне прояснить проблему.

Я хочу разместить коды на Github, и когда кто-нибудь получит и запустит их (тщательно создаст докер); используя предопределенные пользователи и пароли keycloak, используйте приложение. Проблема в том, что когда кто-то каждый раз запускает код с помощью Docker Compose, нет области, пользователей и ролей, потому что образ Keycloak извлекается и запускается без каких-либо данных (областей, пользователя и т. д.). На самом деле я не хочу, чтобы пользователи, запускающие приложение, определяли данные Keycloak (область, пользователь и т. д.). Я хочу, чтобы эти данные уже существовали в каждом запущенном приложении, чтобы пользователи могли войти в мое приложение и использовать его.

приложение.yml:

spring:
  application:
    name: my-client
  security:
    oauth2:
      client:
        registration:
          myclientapp:
            client-id: my-client-app
            client-secret: secrectKey12345
            scope: openid, profile, roles
            authorization-grant-type: authorization_code
            redirect-uri: http://localhost:8085/login/oauth2/code/myclientapp
        provider:
          myclientapp:
            authorization-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/auth
            token-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/token
            jwk-set-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/certs
            user-info-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/userinfo
            user-name-attribute: preferred_username

файл pox.xml:

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.my-client</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>client</name>
    <description>Demo project for Spring Client</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Большое спасибо.

Есть ли причина, по которой мой пост не ответил на ваш вопрос?

ch4mp 10.07.2024 16:40

Спасибо за ваш ответ. Мне жаль, что я не посещал stackoverflow последние несколько дней. Я попробую ваше решение.

vali hatami 11.07.2024 09:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Короткий ответ

Экспортируйте свою область Keycloak и пользователей и добавьте их в папку контейнера /opt/keycloak/data/import/.

Шаг за шагом

После того, как ваши клиенты и пользователи области настроены с помощью пользовательского интерфейса администратора Keycloak, на рабочем столе Docker:

  • перейдите на вкладку контейнера Keycloak Exec, чтобы запустить:
cd /opt/keycloak/bin/
sh ./kc.sh export --dir /tmp/keycloak/ --users realm_file
  • перейдите на вкладку Files и возьмите файл экспорта для области, которую вы хотите восстановить в /tmp/keycloak/ (здесь и далее я сохраняю его в каталоге ./keycloak/import/ относительно файла компоновки Docker, но мог бы выбрать ./keycloak/data/import/, чтобы сохранить ту же структуру каталогов, что и при установке Keycloak в контейнере)
  • отредактируйте файл компоновки, добавив volume для монтирования в /opt/keycloak/data/import/ каталог, в котором вы сохранили файл, экспортированный из Keycloak. В моем случае:
    volumes:
      - ./keycloak/import/:/opt/keycloak/data/import/

Примеры полных проектов, делающих это:

Спасибо за ваш ответ. Мне жаль, что я не посещал stackoverflow последние несколько дней. Я попробую ваше решение.

vali hatami 11.07.2024 09:46

Это сработало. Спасибо за помощь.

vali hatami 13.07.2024 19:12

Я думаю, если мы настроим нашу базу данных, они должны сохраниться.

Если эта база данных не находится в одноразовом контейнере Docker, да, конфигурация сохраняется. Но в любом случае это не соответствует требованию в теле вопроса: устанавливать начальную конфигурацию, когда разработчик запускает файл компоновки на новом компьютере.

ch4mp 13.07.2024 19:18

Другие вопросы по теме