【问题标题】:Keycloak - Custom SPI does not appear in listKeycloak - 自定义 SPI 未出现在列表中
【发布时间】:2020-01-31 20:48:47
【问题描述】:

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

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

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

我能做什么?

【问题讨论】:

    标签: java spring-boot wildfly keycloak spi


    【解决方案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。
        猜你喜欢
        • 1970-01-01
        • 2021-04-16
        • 2020-09-15
        • 2020-01-08
        • 2019-12-19
        • 2019-04-09
        • 2019-06-26
        • 2020-07-25
        • 2021-11-01
        相关资源
        最近更新 更多