Keycloak - 自定义 SPI 未出现在列表中

Keycloak - Custom SPI does not appear in list

我为我的 keycloak 服务器创建了一个自定义 SPI,现在我必须在管理控制台上配置它。

我将 SPI 添加为一个模块,手动安装,所以我把它放在 modules/{package-name}/main 上,module.xml;我还把 standalone.xml 放在了 keycloak-server 子系统中。

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

我能做什么?

考虑将您的 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 喜欢:

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

我最终的解决方案是应用

中的示例

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

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

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

有关 this post 的更多信息。