jboss - 部署自定义 SPI (FreeMarkerLoginFormsProvider) 时出现问题

标签 jboss keycloak

故事

我正在使用 keycloak 6.0.1。我有一个领域有两种类型的用户:管理员和普通用户。我需要一个可以区分它们的主题,因为登录名不同(3 个字段与 2 个字段)。因此,我想扩展提供程序 FreeMarkerLoginFormsProvider 以传递自定义参数。我正在使用 keycloak deployer 来部署我的 SPI。

问题

不幸的是,Keycloak 在部署时抛出异常:

09:55:32,170 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) WFLYCTL0013: Operation ("full-replace-deployment") failed - address: ([]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"spi-1.0.0.jar\".POST_MODULE" => "WFLYSRV0153: Failed to process phase POST_MODULE of deployment \"spi-1.0.0.jar\" Caused by: java.lang.NoClassDefFoundError: org/keycloak/theme/FreeMarkerUtil Caused by: java.lang.ClassNotFoundException: org.keycloak.theme.FreeMarkerUtil from [Module \"deployment.spi-1.0.0.jar\" from Service Module Loader]"}} 09:55:32,165 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."spi-1.0.0.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."spi-1.0.0.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "spi-1.0.0.jar" at org.jboss.as.server@8.0.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183) at org.jboss.msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1738) at org.jboss.msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1700) at org.jboss.msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1558) at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.NoClassDefFoundError: org/keycloak/theme/FreeMarkerUtil at deployment.spi-1.0.0.jar//com.example.keycloak.spi.CustomFreeMarkerLoginFormsProviderFactory.init(CustomFreeMarkerLoginFormsProviderFactory.java:23) at org.keycloak.keycloak-services@6.0.1//org.keycloak.services.DefaultKeycloakSessionFactory.loadFactories(DefaultKeycloakSessionFactory.java:217) at org.keycloak.keycloak-services@6.0.1//org.keycloak.services.DefaultKeycloakSessionFactory.deploy(DefaultKeycloakSessionFactory.java:115) at org.keycloak.keycloak-services@6.0.1//org.keycloak.provider.ProviderManagerRegistry.deploy(ProviderManagerRegistry.java:42) at org.keycloak.keycloak-wildfly-server-subsystem@6.0.1//org.keycloak.subsystem.server.extension.KeycloakProviderDeploymentProcessor.deploy(KeycloakProviderDeploymentProcessor.java:55) at org.jboss.as.server@8.0.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176) ... 8 more Caused by: java.lang.ClassNotFoundException: org.keycloak.theme.FreeMarkerUtil from [Module "deployment.spi-1.0.0.jar" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ... 14 more

我也尝试过模块方法,但后来我得到一个 NullPointerException:

09:23:09,394 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-1) Uncaught server error: java.lang.NullPointerException at org.keycloak.keycloak-services@6.0.1//org.keycloak.protocol.AuthorizationEndpointBase.createAuthenticationSession(AuthorizationEndpointBase.java:193) at org.keycloak.keycloak-services@6.0.1//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.process(AuthorizationEndpoint.java:141) at org.keycloak.keycloak-services@6.0.1//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildGet(AuthorizationEndpoint.java:108) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.resteasy.resteasy-jaxrs@3.6.3.Final//org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)...

我一直在关注官方文档。我的另一个自定义 Pbkdf2PasswordHashProvider 实际上工作得很好。我在这里遗漏了什么吗?

来源

import org.keycloak.forms.login.freemarker.FreeMarkerLoginFormsProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.theme.FreeMarkerUtil;

public class CustomFreeMarkerLoginFormsProvider extends FreeMarkerLoginFormsProvider {

    public CustomFreeMarkerLoginFormsProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
        super(session, freeMarker);
        setAttribute("isAdmin", uriInfo.getPath().contains("admin"));
    }
}

最佳答案

我在 FreeMarkerAccountProvider/FreeMarkerAccountProviderFactory 中遇到了类似的情况,并且收到了 java.lang.NoClassDefFoundError: org/keycloak/theme/FreeMarkerUtil .

这解决了问题 Keycloak plugin using keycloak-services .

因为我正在使用 Keycloak 部署程序注册我的提供商。它似乎并没有处理所有的依赖关系,所以我在 src/main/resources/META-INF 下创建了一个 jboss-deployment-structure.xml 文件和我的依赖关系。这里的例子 jboss-deployment- structure.xml .

我还不得不禁用现有的提供程序并激活我的。我通过在 <subsystem xmlns="urn:jboss:domain:keycloak-server:1.1"> 中将以下内容添加到我的 standalone.xlm 来做到这一点标签:

<spi name="account">
  <provider name="freemarker" enabled="false"/>
  <provider name="myfreemarker" enabled="true"/>
</spi>

关于jboss - 部署自定义 SPI (FreeMarkerLoginFormsProvider) 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663415/

相关文章:

jboss - JBoss Application Server 7中的接缝?

java - JBoss相当于HTTPModule

java - 如何在 JBoss 6.1 EAP 的 Java EE 中以编程方式获取绑定(bind)服务器地址和端口?

android - 使用 Pipe (Aerogear) 调用 api 时获取状态代码 404 和服务连接错误

jboss - MQJMS2005 : failed to create MQQueueManager from JBOSS

java - JBoss/Java 和 SSL

reactjs - 为什么 keycloak 在页面刷新时未经授权?

postgresql - Keycloak 服务器未开始使用云数据库服务

keycloak - Keycloak 中的 "Welcome"字母的 "Finish registration"

json - Keycloak记录到JSON格式消息字段