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.xmllike:

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

【讨论】:

好的,现在它可以与热部署一起使用,但它仍然没有出现在列表中。我还必须更改 吗?因为现在我有了“主人” 您可以在 ServerInfo -> Providers 中搜索您的 SPI 实现的 provider-id(它是服务器范围的信息)。如果你找到了,那么一切都好。您实施了哪种类型的 SPI? 最后,我将 github.com/thomasdarimont/keycloak-user-storage-provider-demo 中的示例应用到了 EntityManger 中,并且它可以工作 哦,是的,EntityManager,终于记住了为什么将 SPI 实现部署为静态 JBoss 模块对我不起作用。据我了解,Wildfly 具有仅用于动态部署(EAR、WAR、JAR)的 EJB 挂钩,但静态模块启动得太早,因此 EntityManagers 不会被注入到 SPI bean。

以上是关于Keycloak - 自定义 SPI 未出现在列表中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Docker 时未加载 Keycloak SPI 提供程序和层

带有外部 Jar 的 Keycloak 自定义 SPI 部署

具有授权的 Keycloak 自定义 SPI REST 端点

在自定义 Keycloak SPI Authenticator 中处理用户的取消

为Keycloak添加自定义API

keycloak~自定义rest接口