Добавить расширение Liquibase в Keycloak

#wildfly #keycloak #liquibase #hana

#wildfly #keycloak #liquibase #хана

Вопрос:

Я пытаюсь использовать образ docker Keycloak с нестандартной базой данных (HANA-DB).

Изменение конфигурации, как описано в документации, сработало нормально, и keycloak подключается к базе данных. Оставшаяся проблема, по-видимому, заключается в том, что миграции Liquibase не могут выполняться, потому что Liquibase не знает, как обрабатывать HANA-DB из коробки.

Конечно, существует библиотека расширений (https://mvnrepository.com/artifact/org.liquibase.ext/liquibase-hanadb/4.0.0 ), которое добавляет эту возможность в Liquibase. Теперь мой вопрос: как мне заставить Liquibase Keycloak использовать эту библиотеку?

Я уже пробовал:

  • Упаковка библиотеки в ее собственный модуль и добавление к нему зависимости в модуле Liquibase от Keycloak
  • Добавление библиотеки в качестве второго resource-root модуля Liquibase от Keycloak

Оба не сработали, т. Е. Liquibase по-прежнему не распознает базу данных «HDB».

Каков был бы правильный способ сделать это?

Ответ №1:

Я действительно сделал это! Способ, которым я этого добился, не идеален, но работает keycloak 11.0.2 Docker Image. Keycloak с Hana и миграция Liquibase в Hana DB работает, и к настоящему времени все тесты для нас пройдены.

Я просто дам вам краткое описание того, что я сделал. И, возможно, напишите небольшую запись в блоге для этого.

В принципе, ваш ответ помог мне в какой-то момент, и вы были на правильном пути. Что я сделал:

  1. Создание другого поставщика БД для сценариев начальной загрузки JBoss CLI (https://medium.com/@victor.boaventura/keycloak-using-alternative-databases-e2b13576c457).
  • Драйверу Hana DB также требовался глобальный модуль /subsystem=ee:write-attribute(name="global-modules",value=[{"name" => "jdk.net","slot" => "main"}, {"name" => "org.liquibase","slot" => "main"}]) (JBOSS CLI)
  • Keycloak не обнаружил автоматически правильный диалект гибернации, поэтому пришлось добавить и это: /subsystem=keycloak-server/spi=connectionsJpa/provider=default/:write-attribute(name=properties,value={"dataSource" => "java:jboss/datasources/KeycloakDS","initializeEmpty" => "true","driverDialect" => "org.hibernate.dialect.HANAColumnStoreDialect","migrationStrategy" => "update","migrationExport" => expression "${jboss.home.dir}/keycloak-database-update.sql"})
  1. Обновлен модуль Liquibase до версии 3.6.3 и добавлен адаптер Liquibase Hana DB 3.9.0 (https://github.com/liquibase/liquibase-hanadb ) в качестве второго корневого ресурса в том же модуле. (Было довольно сложно заставить версии работать) Также модулю требовалась другая зависимость от ‘org.slf4j’, чтобы заставить ведение журнала работать.
  2. На данный момент я боролся со сканированием пакета Liquibase и исключением Keycloaks в ‘liquibase.ext’. Вот почему мне пришлось добавить SystemProp ‘liquibase.scan.packages’ (спасибо вам здесь :))

liquibase.scan.packages=org.keycloak.connections.jpa.updater.liquibase.lock,liquibase.change,liquibase.changelog,liquibase.database,liquibase.parser.core.xml,liquibase.precondition,liquibase.datatype,liquibase.serializer.core.xml,liquibase.sqlgenerator,liquibase.executor,liquibase.snapshot,liquibase.logging,liquibase.diff,liquibase.structure,liquibase.structurecompare,liquibase.lockservice,liquibase.sdk.database,liquibase.ext

  1. После этого Keycloak распознал Hana DB для Liquibase, и миграция началась. Я был очень счастлив, но одна проблема решена, появляется следующая…
  2. 2 из списков изменений liquibase не работали с Hana DB из-за некоторых особенностей SQL. Вот почему я создал два патча и применил их к модулю keycloak-model-jpa. В основном они уже обрабатывали особые случаи (которые завершились неудачей) для oracle, поэтому я просто добавил ‘hana’ к каждому предварительному условию, где упоминался ‘oracle’, и это сработало!

Это в основном мое решение. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь задавать их здесь или связаться со мной.

Ответ №2:

Оказывается, что добавление библиотеки в качестве второго resource-root в модуле liquibase от Keycloaks действительно работает. Оно не загружается, потому что Keycloak удаляет liquibase.ext из сервисного загрузчика, используемого для поиска расширений liquibase.

Однако это можно обойти, используя liquibase.scan.packages системное свойство.

Для всех, кто пытается заставить Keycloak работать с HANA:

  • Переопределение liquibase.scan.packages системного свойства приводит к загрузке библиотеки
  • Теперь класс ( LoggingService ) из liquibase, на который ссылается библиотека liquibase-hanadb, не может быть найден, потому что он был введен в liquibase 3.6, а Keycloak поставляется с 3.5.5.
  • При взломе более поздней версии liquibase (3.6.0) в модулях Keycloak по какой-то причине выполняется набор изменений, предназначенный только для DB2, что приводит к ошибкам. Я подозреваю несовместимость между журналами изменений Keycloak и обновленной версией liquibase.

На этом этапе я сдался.