Keycloak - 自定义 SPI 未出现在列表中
Posted
技术标签:
【中文标题】Keycloak - 自定义 SPI 未出现在列表中【英文标题】:Keycloak - Custom SPI does not appear in list 【发布时间】:2020-01-31 20:48:47 【问题描述】:我为我的 keycloak 服务器制作了一个自定义 SPI,现在我必须在管理控制台上对其进行配置。
我将 SPI 添加为模块,手动安装,所以我将它放在 modules/package-name/main 上,带有 module.xml;我也把它放在了standalone.xml,也放在了keycloak-server子系统中。
完成所有这些配置后,我然后去管理控制台配置自定义用户提供程序,它没有出现在列表中。
我能做什么?
【问题讨论】:
【参考方案1】:我的最终解决方案是应用来自
的示例https://github.com/thomasdarimont/keycloak-user-storage-provider-demo
并更改 EntityManager 的 UserRepository 以连接数据库。
【讨论】:
【参考方案2】:找到了一种方法,就是在classpath:$jboss.home.dir/providers/
中添加文件,因为在那里发现的模块中的SPI被Keycloak解释。
更多关于this post的信息。
【讨论】:
【参考方案3】:考虑将 SPI 实现部署为 JAR 或 EAR。当我想将它们作为 JBoss 模块部署到 keycloak 时,我也遇到了一些麻烦,但我不记得具体是什么(在我的公司,我们使用自定义 SPI 实现对 Keycloak 进行了大量定制,包括 Authenticators、UserStorageProvider、REST 端点、OIDC 映射器。 ..)。现在我们将它们部署为 EAR 包。以下是使用 maven 执行 EAR 打包的方法:
<name>Keycloak Extensions EAR</name>
<artifactId>cardpay-extensions</artifactId>
<packaging>ear</packaging>
<properties>
...
</properties>
<dependencies>
<!-- Your jars with provider implementations, I'm use two jars (for unit testing simplicity) -->
<dependency>
<groupId>com.acme</groupId>
<artifactId>extensions-core</artifactId>
<version>$project.version</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.acme</groupId>
<artifactId>extensions-providers</artifactId>
<version>$project.version</version>
<type>ejb</type>
</dependency>
</dependencies>
<build>
<finalName>$project.artifactId</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<version>8</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<outputFileNameMapping>@artifactId@.@extension@</outputFileNameMapping>
</configuration>
</plugin>
</plugins>
</build>
别忘了加main/application/META-INF/jboss-deployment-structure.xml
like:
<?xml version="1.0" ?>
<jboss-deployment-structure>
<!-- Core module -->
<module name="deployment.extensions.core">
<resources>
<resource-root path="lib/core.jar"/>
</resources>
<dependencies>
<module name="com.oracle.ojdbc" export="true"/>
<module name="org.jboss.logging" export="true"/>
<module name="org.apache.commons.io" export="true"/>
<module name="javax.ws.rs.api" export="true"/>
<module name="org.keycloak.keycloak-common" export="true"/>
<module name="org.keycloak.keycloak-core" export="true"/>
<module name="org.keycloak.keycloak-server-spi" export="true"/>
<module name="org.keycloak.keycloak-server-spi-private" export="true"/>
<module name="org.keycloak.keycloak-services" export="true"/>
</dependencies>
</module>
<!-- Define dependency on core module for all sub-deployments -->
<deployment>
<dependencies>
<module name="deployment.extensions.core" export="true"/>
</dependencies>
</deployment>
<!-- Providers bundle -->
<sub-deployment name="providers.jar">
<dependencies>
<module name="javax.api"/>
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
现在您可以将 maven-wildfly-plugin 用于 mvn wildfly:deploy 或通过 JBoss cli 或部署扫描器手动部署 ear(查看 Wildfly 工件部署文档)。您应该会在 Wildfly 日志中看到有关扩展部署的相应消息(会有 ProviderFactory id)
关于使用模块时 SPI 实现不可用,我猜这是因为 JBoss 模块加载得太早,所以 Keycloak 部署子系统看不到它们。
【讨论】:
好的,现在它可以与热部署一起使用,但它仍然没有出现在列表中。我还必须更改以上是关于Keycloak - 自定义 SPI 未出现在列表中的主要内容,如果未能解决你的问题,请参考以下文章
使用 Docker 时未加载 Keycloak SPI 提供程序和层
带有外部 Jar 的 Keycloak 自定义 SPI 部署
具有授权的 Keycloak 自定义 SPI REST 端点