3 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個贊
找到了一種方法,就是在里面添加文件classpath:${jboss.home.dir}/providers/
,因?yàn)槟抢镎业降腟PI內(nèi)部模塊是由Keycloak解釋的。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個贊
我的最終解決方案是應(yīng)用來自的示例
https://github.com/thomasdarimont/keycloak-user-storage-provider-demo
并更改 EntityManager 的 UserRepository 以連接數(shù)據(jù)庫。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個贊
考慮將 SPI 實(shí)現(xiàn)部署為 JAR 或 EAR。當(dāng)我想將它們部署到 keycloak 作為 JBoss 模塊時,我也遇到了一些麻煩,但我不記得具體是什么(在我的公司,我們使用自定義 SPI 實(shí)現(xiàn)大量定制了 Keycloak,包括 Authenticators、UserStorageProvider、REST 端點(diǎn)、OIDC 映射器。 ..)。現(xiàn)在我們將它們部署為 EAR 包。以下是使用 Maven 執(zhí)行 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如下內(nèi)容:
<?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>
現(xiàn)在,您可以使用 maven-wildfly-plugin 進(jìn)行 mvn wildfly:deploy 或通過 JBoss cli 或部署掃描器手動部署 Ear(查看 Wildfly 工件部署文檔)。您應(yīng)該在 Wildfly 日志中看到有關(guān)擴(kuò)展部署的相應(yīng)消息(會有 ProviderFactory id)
關(guān)于使用模塊時 SPI 實(shí)現(xiàn)不可用,我猜這是因?yàn)?JBoss 模塊加載得太早,所以 Keycloak 部署程序子系統(tǒng)看不到它們。
添加回答
舉報(bào)