将 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 使用这个库?
我已经试过了:
- 将库打包到自己的模块中,并在 Keycloak 的 Liquibase 模块中添加依赖项
- 将库作为第二个
resource-root
添加到 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 正在运行,现在我们的所有测试都已通过。
我将简要介绍一下我的工作。也许为此写一点博客条目。
基本上你的回答在某些时候帮助了我,你走在了正确的轨道上。
我做了什么:
- 为 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"})
- 将 Liquibase 模块更新到版本 3.6.3,并添加 Liquibase Hana DB Adapter 3.9.0 (https://github.com/liquibase/liquibase-hanadb) 作为同一模块中的第二个资源根。 (让版本工作有点棘手)模块还需要对 'org.slf4j' 的另一个依赖才能使日志记录工作。
- 在这一点上,我在 '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
- 在那之后,Keycloak 识别出 Liquibase 的 Hana DB,迁移开始了。我非常高兴,但是一个问题解决了下一个问题...
由于某些 SQL 细节,- 2 个 liquibase 更新日志无法与 Hana DB 一起使用。这就是为什么我创建了两个补丁并将它们应用到 keycloak-model-jpa 模块的原因。基本上他们已经为 oracle 处理了特殊情况(失败的),所以我只是将 'hana' 添加到每个前提条件中,其中提到了 'oracle' 并且它起作用了!
这基本上是我的解决方案。如果您有任何问题,请随时在这里提问或联系我。
我正在尝试将 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 使用这个库?
我已经试过了:
- 将库打包到自己的模块中,并在 Keycloak 的 Liquibase 模块中添加依赖项
- 将库作为第二个
resource-root
添加到 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 正在运行,现在我们的所有测试都已通过。
我将简要介绍一下我的工作。也许为此写一点博客条目。
基本上你的回答在某些时候帮助了我,你走在了正确的轨道上。 我做了什么:
- 为 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"})
- 将 Liquibase 模块更新到版本 3.6.3,并添加 Liquibase Hana DB Adapter 3.9.0 (https://github.com/liquibase/liquibase-hanadb) 作为同一模块中的第二个资源根。 (让版本工作有点棘手)模块还需要对 'org.slf4j' 的另一个依赖才能使日志记录工作。
- 在这一点上,我在 '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
- 在那之后,Keycloak 识别出 Liquibase 的 Hana DB,迁移开始了。我非常高兴,但是一个问题解决了下一个问题... 由于某些 SQL 细节,
- 2 个 liquibase 更新日志无法与 Hana DB 一起使用。这就是为什么我创建了两个补丁并将它们应用到 keycloak-model-jpa 模块的原因。基本上他们已经为 oracle 处理了特殊情况(失败的),所以我只是将 'hana' 添加到每个前提条件中,其中提到了 'oracle' 并且它起作用了!
这基本上是我的解决方案。如果您有任何问题,请随时在这里提问或联系我。