Keycloak-自定义SPI不在列表中

时间:2019-10-02 14:37:30

标签: java spring-boot wildfly keycloak spi

我为Keycloak服务器制作了一个自定义SPI,现在我必须在管理控制台上对其进行配置。

我通过手动安装将SPI作为模块添加,因此我将其与module.xml一起放在modules / {package-name} / main上;我还把放在standalone.xml上,也放在了keycloak-server子系统上。

完成所有配置后,我然后转到管理控制台以配置自定义用户提供程序,它不会出现在列表中。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

找到了一种方法,就是在classpath:${jboss.home.dir}/providers/内添加文件,因为其中的SPI内部模块由Keycloak解释。

有关this post的更多信息。

答案 1 :(得分:0)

请考虑将SPI实现部署为JAR或EAR。当我想将它们作为JBoss模块部署到keycloak时,我也遇到了一些麻烦,但是我不记得确切的含义(在我公司中,我们使用包括身份验证器,UserStorageProvider,REST终结点,OIDC映射器等自定义SPI实现大量定制了Keycloak。 ..)。现在,我们将它们作为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

<?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部署程序子系统看不到它们。

答案 2 :(得分:0)

我的最终解决方案是应用

中的示例

https://github.com/thomasdarimont/keycloak-user-storage-provider-demo

并更改UserRepository以使EntityManager与数据库连接。