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

Jboss 部署自定义SPI(FreeMarkerLoginFormsProvider)时出现问题,jboss,keycloak,Jboss,Keycloak,故事 我使用的是KeyClope 6.0.1。我有一个领域有两种类型的用户:管理员和普通用户。我需要一个主题,可以区分他们,因为登录是不同的3个字段与2个字段。因此,我希望扩展提供程序FreeMarkerLoginFormsProvider以传递自定义参数。我正在使用KeyClope部署器部署我的SPI 问题 KeyClope在部署时不幸引发异常: 09:55:32170错误[org.jboss.as.controller.management operation]DeploymentScann

故事

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

问题

KeyClope在部署时不幸引发异常:

09:55:32170错误[org.jboss.as.controller.management operation]DeploymentScanner线程-1 WFLYCTL0013:操作完全替换部署失败-地址:[]-故障描述:{WFLYCTL0080:失败的服务=>{jboss.deployment.unit.\spi-1.0.0.jar\.POST_模块=>WFLYSRV0153:无法处理部署的阶段POST_模块\spi-1.0.0.jar\ 原因:java.lang.NoClassDefFoundError:org/keydape/theme/freemakerutil 原因:java.lang.ClassNotFoundException:org.keydape.theme.freemakerutil from[Module\deployment.spi-1.0.0.jar\from Service Module Loader]} 09:55:32165错误[org.jboss.msc.service.fail]msc服务线程1-3 MSC000001:无法启动服务jboss.deployment.unit.spi-1.0.0.jar.POST_模块:org.jboss.msc.service.StartException服务jboss.deployment.unit.spi-1.0.jar.POST_模块:WFLYSRV0153:无法处理部署spi-1.0.0.jar的阶段后_模块 在org.jboss.as。server@8.0.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.startDeploymentUnitPhaseService.java:183 在org.jboss。msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startServiceControllerImpl.java:1738 在org.jboss。msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.executeServiceControllerImpl.java:1700 在org.jboss。msc@1.4.5.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.runServiceControllerImpl.java:1558 在org.jboss。threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.runContextClassLoaderSavingRunnable.java:35 在org.jboss。threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRunEnhancedQueueExecutor.java:1982 在org.jboss。threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTaskEnhancedQueueExecutor.java:1486 在org.jboss。threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.runEnhancedQueueExecutor.java:1377 java.base/java.lang.Thread.runThread.java:834 原因:java.lang.NoClassDefFoundError:org/keydape/theme/freemakerutil 位于deployment.spi-1.0.0.jar//com.example.keydavet.spi.CustomFreeMarkerLoginFormsProviderFactory.initCustomFreeMarkerLoginFormsProviderFactory.java:23 在org.keydape.keydape-services@6.0.1//org.keydepot.services.defaultkeydeposessionfactory.LoadFactoriesDefaultkeydeposessionFactory.java:217 在org.keydape.keydape-services@6.0.1//org.keydeport.services.defaultkeydeposessionfactory.deployDefaultkeydeposessionfactory.java:115 在org.keydape.keydape-services@6.0.1//org.keydrope.provider.ProviderManagerRegistry.deployProviderManagerRegistry.java:42 在org.keydove.keydove-wildfly-server上-subsystem@6.0.1//org.keydove.subsystem.server.extension.keydoveproviderdeploymentprocessor.deploykeydoveproviderdeploymentprocessor.java:55 在org.jboss.as。server@8.0.0.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.startDeploymentUnitPhaseService.java:176 …还有8个 原因:java.lang.ClassNotFoundException:org.keydape.theme.FreeMarkerUtil来自[Module deployment.spi-1.0.0.jar from Service Module Loader] 位于org.jboss.modules.ModuleClassLoader.findClassModuleClassLoader.java:255 位于org.jboss.modules.ConcurrentClassLoader.performLoadClassUncheckedConcurrentClassLoader.java:410 位于org.jboss.modules.ConcurrentClassLoader.performLoadClassConcurrentClassLoader.java:398 位于org.jboss.modules.ConcurrentClassLoader.loadClassConcurrentClassLoader.java:116 …还有14个

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

09:23:09394错误[org.keydapore.services.ERROR.keydaporerrorhandler]默认任务-1未捕获服务器错误:java.lang.NullPointerException 在org.keydape.keydape-services@6.0.1//org.keydrope.protocol.AuthorizationEndpointBase.createAuthenticationSessionAuthorizationEndpointBase.java:193 在org.keydape.keydape-services@6.0.1//org.keydape.protocol.oidc.endpoints.AuthorizationEndpoint.processAuthorizationEndpoint.java:141 在org.keydape.keydape-services@6.0.1//org.keydape.protocol.oidc.endpoints.AuthorizationEndpoint.buildGetAuthorizationEndpoint.java:108 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0Native方法 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 位于java.base/jdk.internal.reflect.Delegat ingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 位于java.base/java.lang.reflect.Method.invokeMethod.java:566 在org.jboss.resteasy.resteasy-jaxrs@3.6.3.Final//org.jboss.resteasy.core.MethodInjectorImpl.invokeMethodInjectorImpl.java:139

我一直在关注官方文件。我的另一个自定义Pbkdf2PasswordHashProvider实际上工作得很好。我是不是遗漏了什么

来源


我可能会为你找到一个解决方案我有一个类似的问题,现在为我工作,告诉我它是否也为你工作。 我认为您的代码中有一个CustomFreeMarkerLoginFormsProviderFactory,它随CustomFreeMarkerLoginFormsProvider一起提供

public class CustomFreeMarkerLoginFormsFactory extends FreeMarkerLoginFormsProviderFactory {

private FreeMarkerUtil freeMarker;

@Override
public LoginFormsProvider create(KeycloakSession session) {
    return new CustomFreeMarkerLoginFormsProvider(session, freeMarker);
}

@Override
public void init(Config.Scope config) {
    freeMarker = new FreeMarkerUtil();
}

@Override
public void postInit(KeycloakSessionFactory factory) {}

@Override
public void close() {
    freeMarker = null;
}

@Override
public String getId() {
    return "customfreemarker";
}
}

然后,您需要在standalone-configuration.cli中激活您的提供程序,如下图所示:

嵌入服务器-server config=standalone.xml /subsystem=keydape服务器/spi=login:add /subsystem=keydape服务器/spi=login/provider=freemarker:addenabled=false /subsystem=keydape服务器/spi=login/provider=customfreemarker:addenabled=true

似乎您不需要为登录提供程序激活自定义工厂。我保留默认的id freemarker,并将其考虑在内,而不是默认的工厂。只有登录提供者工厂是这样工作的,不知道为什么

当我使用与原始类FreeMarkerLoginFormsProviderFactory相同的函数(如bellow)更改函数时,它可以工作,并且不再需要standalone.xml中的行:

@Override
public String getId() {
    return "freemarker";
}
我认为这是钥匙斗篷的问题/重要性??因为它和你说的其他供应商合作得很好。但我在《钥匙斗篷》杂志上找不到任何相关信息。问题出现在v4.4.0.Final和4.5.0.Final之间。
请随时通知我您的进度。

我与FreeMarkerAccountProvider/FreeMarkerAccountProviderFactory有类似的情况,并收到java.lang.NoClassDefFoundError:org/keydepot/theme/FreeMarkerUtil

这就解决了问题

当我用KeyClope部署器注册我的提供商时。它似乎没有包含所有依赖项,因此我在src/main/resources/META-INF下创建了一个jboss-deployment-structure.xml文件,其中包含我的依赖项

我还不得不禁用现有的提供商并激活我的提供商。为此,我在标记中向我的standalone.xlm添加了以下内容:

@Override
public String getId() {
    return "freemarker";
}
<spi name="account">
  <provider name="freemarker" enabled="false"/>
  <provider name="myfreemarker" enabled="true"/>
</spi>