将 Liquibase 扩展添加到 Keycloak

Add Liquibase extension to Keycloak

我正在尝试将 Keycloak docker 图像与非标准数据库 (HANA-DB) 一起使用。

按照 documentation 中的描述修改配置工作正常,keycloak 连接到数据库。剩下的问题似乎是 Liquibase 迁移不能 运行 因为 Liquibase 不知道如何开箱即用地处理 HANA-DB。

当然,有一个扩展库(https://mvnrepository.com/artifact/org.liquibase.ext/liquibase-hanadb/4.0.0)将此功能添加到 Liquibase。现在我的问题是:如何让 Keycloak 的 Liquibase 使用这个库?

我已经试过了:

两者均无效,即 Liquibase 仍无法识别“HDB”数据库。

执行此操作的正确方法是什么?

事实证明,将库作为​​第二个 resource-root 添加到 Keycloaks 的 liquibase 模块中确实有效。它没有被加载,因为 Keycloak 从用于查找 liquibase 扩展的服务加载器中删除了 liquibase.ext

不过,这可以通过使用 liquibase.scan.packages 系统 属性 来解决。

对于所有试图让 Keycloak 与 HANA 一起工作的人:

  • 覆盖 liquibase.scan.packages 系统 属性 导致加载库
  • 现在,liquibase-hanadb 库中引用的来自 liquibase 的 class (LoggingService) 无法找到,因为它是在 liquibase 3.6 中引入的,而 Keycloak 是 3.5 附带的.5.
  • 当将更新版本的 liquibase (3.6.0) 入侵到 Keycloak 的模块时,出于某种原因,一个仅用于 DB2 的变更集 运行,导致错误。我怀疑 Keycloak 的变更日志与更新的 liquibase 版本不兼容。

此时我放弃了。

我真的做到了! 我实现它的方式并不完美,但 keycloak 11.0.2 Docker 图片是 运行。 使用 Hana 和 Liquibase 迁移到 Hana DB 的 Keycloak 正在运行,现在我们的所有测试都已通过。

我将简要介绍一下我的工作。也许为此写一点博客条目。

基本上你的回答在某些时候帮助了我,你走在了正确的轨道上。 我做了什么:

  1. 为 JBoss CLI Bootstrap 脚本(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 没有自动发现正确的 Hibernate 方言,因此不得不添加:/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 Adapter 3.9.0 (https://github.com/liquibase/liquibase-hanadb) 作为同一模块中的第二个资源根。 (让版本工作有点棘手)模块还需要对 'org.slf4j' 的另一个依赖才能使日志记录工作。
  2. 在这一点上,我在 'liquibase.ext' 上遇到了 Liquibase 包扫描和 Keycloaks 排除。这就是为什么我必须添加 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 识别出 Liquibase 的 Hana DB,迁移开始了。我非常高兴,但是一个问题解决了下一个问题...
  2. 由于某些 SQL 细节,
  3. 2 个 liquibase 更新日志无法与 Hana DB 一起使用。这就是为什么我创建了两个补丁并将它们应用到 keycloak-model-jpa 模块的原因。基本上他们已经为 oracle 处理了特殊情况(失败的),所以我只是将 'hana' 添加到每个前提条件中,其中提到了 'oracle' 并且它起作用了!

这基本上是我的解决方案。如果您有任何问题,请随时在这里提问或联系我。