我负责将旧的密钥库(3.4.2)迁移到最新版本。我已经迁移了数据库和模板。 造成问题的最后一件事是“帐户”和“登录”的自定义提供程序。 我有两个扩展的自定义提供程序:
首先,在版本> 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)
答案 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>
如果将其捡起,您应该能够在管理界面的提供者配置中看到它。要查看,请登录管理控制台,单击右上角的用户名,然后选择“服务器信息”,然后单击“提供程序”选项卡。您应该会在“登录”下看到您的提供商。