首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keycloak无法使用自定义操作令牌spi启动

Keycloak无法使用自定义操作令牌spi启动
EN

Stack Overflow用户
提问于 2019-06-21 19:17:35
回答 1查看 1.1K关注 0票数 4

我是一对自定义SPIs to Keycloak(6.0.1),我还需要创建一个自定义操作令牌,该令牌将发送给用户。

我已经创建了一个自定义的事件侦听器、电子邮件发送器、所需的操作,并将所有这些都部署到一个jar中。

当我尝试将操作令牌处理程序与适当的清单条目放在一起时,我得到了如下结果

代码语言:javascript
复制
Caused by: java.lang.NoClassDefFoundError: Failed to link com/mycompany/providers/registration/actiontoken/Invitati
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1095)
at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:424)
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:555)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:339)
at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:126)
at org.jboss.modules.Module.loadModuleClass(Module.java:731)
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:247)
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)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1209)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1220)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1264)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1299)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1384)
at org.keycloak.keycloak-services@6.0.1//org.keycloak.provider.DefaultProviderLoader.load(DefaultProviderLoader.java:60)

处理程序的定义

代码语言:javascript
复制
package com.mycompany.providers.registration.actiontoken;

import org.keycloak.TokenVerifier;
import
org.keycloak.authentication.actiontoken.AbstractActionTokenHander;
import org.keycloak.authentication.actiontoken.ActionTokenContext;
import org.keycloak.authentication.actiontoken.TokenUtils;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.sessions.AuthenticationSessionModel;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

public class InvitationActionTokenHandler extends AbstractActionTokenHander<InvitationActionToken> {
public InvitationActionTokenHandler(String id, Class<InvitationActionToken> tokenClass, String defaultErrorMessage, EventType defaultEventType, String defaultEventError) {
    super(id, tokenClass, defaultErrorMessage, defaultEventType, defaultEventError);
}

    @Override
    public Response handleToken(InvitationActionToken invitationActionToken, ActionTokenContext<InvitationActionToken> tokenContext) {
    AuthenticationSessionModel authSession = tokenContext.getAuthenticationSession();
    final UriInfo uriInfo = tokenContext.getUriInfo();
    final RealmModel realm = tokenContext.getRealm();
    EventBuilder event = tokenContext.getEvent();
    final KeycloakSession session = tokenContext.getSession();
    String nextAction = AuthenticationManager.nextRequiredAction(session, authSession, tokenContext.getClientConnection(), tokenContext.getRequest(), uriInfo, event);
    return AuthenticationManager.redirectToRequiredActions(session, realm, authSession, uriInfo, nextAction);
}

@Override
public TokenVerifier.Predicate<? super InvitationActionToken>[] getVerifiers(ActionTokenContext<InvitationActionToken> tokenContext) {
    return TokenUtils.predicates(
    );
}
}

和文件META-INF/services/org.keycloak.authentication.actiontoken.ActionTokenHandlerFactory中的清单

代码语言:javascript
复制
com.mycompany.providers.registration.actiontoken.InvitationActionTokenHandler

我已经添加了可能是Keycloak的所有依赖项

代码语言:javascript
复制
apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

dependencies {
    compileOnly group: 'org.keycloak', name: 'keycloak-model-jpa', version: '6.0.1'
    compileOnly group: 'org.keycloak', name: 'keycloak-services', version: '6.0.1'
    compileOnly group: 'org.keycloak', name: 'keycloak-server-spi', version: '6.0.1'
    compileOnly group: 'org.keycloak', name: 'keycloak-server-spi-private', version: '6.0.1'
    compileOnly group: 'org.keycloak', name: 'keycloak-core', version: '6.0.1'
    compileOnly group: 'org.keycloak', name: 'keycloak-common', version: '6.0.1'

编辑:更新

因此,我准确地指出类ActionTokenHandler在类路径中不可用,并在已经正常工作的SPI中使用以下代码片段进行了验证。

代码语言:javascript
复制
try {
    Class cls = Class.forName("org.keycloak.authentication.actiontoken.ActionTokenHandler");
} catch (ClassNotFoundException e) {
    //is thrown always
    e.printStackTrace();
}

我已经将gradle依赖项更改为compileOnly,以确保不会出现类路径问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 02:45:52

您必须向应用程序服务器提供包依赖项列表。在src/main/resources/META-INF目录下创建jboss-deployment-structure.xml,内容如下:

代码语言:javascript
复制
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-core" />
            <module name="org.keycloak.keycloak-server-spi" />
            <module name="org.keycloak.keycloak-server-spi-private" />
            <module name="org.keycloak.keycloak-services" />
            <module name="org.keycloak.keycloak-common" />
            <module name="org.keycloak.keycloak-model-jpa" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56702407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档