无法从旧的3.4.2密钥库迁移到最新版本

时间:2019-07-02 09:05:16

标签: migration keycloak

我负责将旧的密钥库(3.4.2)迁移到最新版本。我已经迁移了数据库和模板。 造成问题的最后一件事是“帐户”和“登录”的自定义提供程序。 我有两个扩展的自定义提供程序:

  • FreeMarkerAccountProviderFactory
  • FreeMarkerLoginProviderFactory

首先,在版本> 4.x的密钥库开始时未加载任何提供程序。我进行了调查,发现覆盖默认的[['(a) Total Number of Shares (or Units) Purchased', '', '(b) Average Price Paid per Share (or Unit)']]方法以返回默认值“ freemarker”以外的值会使密钥隐藏再次加载它们。

但是在那之后,如果我尝试访问登录页面,则会在getId()上出现nullpointer异常

有什么想法吗?

编辑:提供商中的spi在META-INF / services中声明,提供商在standalone.xml中声明

编辑2:我共享loginFormProvider,因为它是相同的问题,会触发相同的错误,但实现起来不太复杂

org.keycloak.services.resources.account.AccountFormService.init(AccountFormService.java:139)

1 个答案:

答案 0 :(得分:0)

根据评论链,看来问题在于Keycloak没有选择提供商。您可以通过以下两种方法将自定义提供程序与Keycloak捆绑在一起:作为模块,或作为Deployments目录中的已部署war / ear / jar。

以下是作为模块执行的方法:

您需要将一些配置(umap[arr[i]])和jar添加到modules目录结构。它看起来应该像这样:

1

您的module.xml应该看起来像这样:

(keycloak root)
|- modules
   |- system
      |- layers
         |- keycloak
            |- com
               |- yourcompany
                  |- yourmodule
                     |- main
                        |- your-module-name.jar
                        |- module.xml (see below)

此外,您还需要根据自己的情况配置module.xml和/或可能配置<?xml version="1.0" encoding="UTF-8"?> <module name="com.yourcompany.yourmodule" xmlns="urn:jboss:module:1.6"> <resources> <resource-root path="your-module-name.jar"/> </resources> <dependencies> <!-- whatever module dependencies you need go here --> <!-- these are just an example; you may or may not need them --> <module name="org.jboss.logging" /> <module name="org.keycloak.keycloak-core"/> <module name="org.keycloak.keycloak-services"/> <module name="org.keycloak.keycloak-server-spi"/> <module name="org.keycloak.keycloak-server-spi-private"/> </dependencies> </module> (默认的Keycloak Docker映像默认使用standalone.xml)。相关部分应如下所示:

standalone-ha.xml

最后,就像您提到的那样,您将需要在META-INF / services目录中进行正确的配置:一个文件,该文件具有SPI定义的ProviderFactory的完全限定类名,其中一行包含的完全限定的类名。您的实施。在您的情况下,文件应名为-ha.xml,其值应为一行: <subsystem xmlns="urn:jboss:domain:keycloak-server:1.1"> <web-context>auth</web-context> <providers> <provider> classpath:${jboss.home.dir}/providers/* </provider> <!-- add this --> <provider> module:com.yourcompany.yourmodule </provider> <!-- end add --> </providers> <master-realm-name>master</master-realm-name> <scheduled-task-interval>900</scheduled-task-interval> ... </subsystem>

如果将其捡起,您应该能够在管理界面的提供者配置中看到它。要查看,请登录管理控制台,单击右上角的用户名,然后选择“服务器信息”,然后单击“提供程序”选项卡。您应该会在“登录”下看到您的提供商。