Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keycloak 向JWT添加声明的KeyClope协议映射程序获取空指针异常_Keycloak_Keycloak Services - Fatal编程技术网

Keycloak 向JWT添加声明的KeyClope协议映射程序获取空指针异常

Keycloak 向JWT添加声明的KeyClope协议映射程序获取空指针异常,keycloak,keycloak-services,Keycloak,Keycloak Services,我很难得到一个在Keyclope 6.0.1中工作的非常简单的Keyclope协议映射程序。 我正在尝试向访问令牌添加额外声明。当我将构建的jar复制到部署目录时,我在部署目录中得到以下NullPointerException,在.failed文件中包含以下内容 {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"token-enhancer-1.0-SNAPSHOT.jar\".POST_MODULE" => "

我很难得到一个在Keyclope 6.0.1中工作的非常简单的Keyclope协议映射程序。
我正在尝试向访问令牌添加额外声明。当我将构建的jar复制到部署目录时,我在部署目录中得到以下NullPointerException,在.failed文件中包含以下内容

{"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"token-enhancer-1.0-SNAPSHOT.jar\".POST_MODULE" => "WFLYSRV0153: Failed to process phase POST_MODULE of deployment \"token-enhancer-1.0-SNAPSHOT.jar\"
    Caused by: java.lang.NullPointerException"}}
下面的日志显示了相同的异常

21:18:46,697 INFO  [org.keycloak.subsystem.server.extension.KeycloakProviderDeploymentProcessor] (MSC service thread 1-1) Deploying Keycloak provider: token-enhancer-1.0-SNAPSHOT.jar
21:18:46,718 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.deployment.unit."token-enhancer-1.0-SNAPSHOT.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."token-enhancer-1.0-SNAPSHOT.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "token-enhancer-1.0-SNAPSHOT.jar"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1738)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1700)
        at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1558)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
        at org.keycloak.services.DefaultKeycloakSessionFactory.isInternal(DefaultKeycloakSessionFactory.java:370)
        at org.keycloak.services.DefaultKeycloakSessionFactory.loadFactories(DefaultKeycloakSessionFactory.java:219)
        at org.keycloak.services.DefaultKeycloakSessionFactory.deploy(DefaultKeycloakSessionFactory.java:115)
        at org.keycloak.provider.ProviderManagerRegistry.deploy(ProviderManagerRegistry.java:42)
        at org.keycloak.subsystem.server.extension.KeycloakProviderDeploymentProcessor.deploy(KeycloakProviderDeploymentProcessor.java:55)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176)
        ... 8 more

21:18:46,719 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.\"token-enhancer-1.0-SNAPSHOT.jar\".POST_MODULE" => "WFLYSRV0153: Failed to process phase POST_MODULE of deployment \"token-enhancer-1.0-SNAPSHOT.jar\"
    Caused by: java.lang.NullPointerException"}}
我已将示例代码上载到

下面是我实现的ProtocolMapper类

我有一个艰难的时间,因为我不明白在哪里解决这样一个模糊的错误信息。调查这个问题的好策略是什么

import org.keycloak.models.ClientSessionContext;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.oidc.OIDCLoginProtocol;
import org.keycloak.protocol.oidc.mappers.*;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.AccessToken;
import org.keycloak.representations.IDToken;

import java.util.*;

public class KeycloakTokenEnhancer extends AbstractOIDCProtocolMapper implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {

    public static final String PROVIDER_ID = "oidc-token-enhancer-mapper";

    private static final List<ProviderConfigProperty> configProperties = new ArrayList<>();

    static {
        OIDCAttributeMapperHelper.addIncludeInTokensConfig(configProperties, KeycloakTokenEnhancer.class);
    }

    @Override
    public AccessToken transformAccessToken(AccessToken accessToken, ProtocolMapperModel protocolMapperModel, KeycloakSession keycloakSession, UserSessionModel userSessionModel, ClientSessionContext clientSessionContext) {
        return accessToken;
    }

    @Override
    public String getDisplayCategory() {
        return "Token Enhancer mapper";
    }

    @Override
    public String getDisplayType() {
        return "Token Enhancer Mapper";
    }

    @Override
    public String getHelpText() {
        return "Add to claims for the User Service";
    }

    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return configProperties;
    }

    @Override
    public String getId() {
        return PROVIDER_ID;
    }


    protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession) {
        token.getOtherClaims().put("fruit", "pear, apple, tangerine");
    }

    public static ProtocolMapperModel create(String name, boolean accessToken, boolean idToken, boolean userInfo) {
        ProtocolMapperModel mapper = new ProtocolMapperModel();
        mapper.setName(name);
        mapper.setProtocolMapper(PROVIDER_ID);
        mapper.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
        Map<String, String> config = new HashMap<String, String>();
        if (accessToken) config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
        if (idToken) config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
        if (userInfo) config.put(OIDCAttributeMapperHelper.INCLUDE_IN_USERINFO, "true");
        mapper.setConfig(config);
        return mapper;
    }


}
import org.keydape.models.ClientSessionContext;
导入org.keydepot.models.keydeposition;
导入org.keydepate.models.ProtocolMapperModel;
导入org.keydape.models.UserSessionModel;
导入org.keydape.protocol.oidc.OIDCLoginProtocol;
导入org.keydeport.protocol.oidc.mappers.*;
导入org.keydepot.provider.ProviderConfigProperty;
导入org.keydeport.representations.AccessToken;
导入org.keydeport.representations.IDToken;
导入java.util.*;
公共类keydovetokenhancer扩展了AbstractOIDCProtocolMapper实现了OIDCAccessTokenMapper、OIDCIDTokenMapper、UserInfoTokenMapper{
公共静态最终字符串提供程序\u ID=“oidc令牌增强器映射器”;
私有静态最终列表configProperties=new ArrayList();
静止的{
OIDCAttributeMapperHelper.addIncludeInTokensConfig(configProperties,KeyDoppeTokenEnhancer.class);
}
@凌驾
public AccessToken transformAccessToken(AccessToken AccessToken、ProtocolMapperModel ProtocolMapperModel、Key隐形会话Key隐形会话、UserSessionModel UserSessionModel、ClientSessionContext ClientSessionContext){
返回accessToken;
}
@凌驾
公共字符串getDisplayCategory(){
返回“令牌增强映射器”;
}
@凌驾
公共字符串getDisplayType(){
返回“令牌增强映射器”;
}
@凌驾
公共字符串getHelpText(){
返回“添加到用户服务的声明”;
}
@凌驾
公共列表getConfigProperties(){
返回配置属性;
}
@凌驾
公共字符串getId(){
返回提供者ID;
}
受保护的void setClaim(IDToken令牌、ProtocolMapperModel映射模型、UserSessionModel userSession){
token.getOtherClaims().put(“水果”、“梨、苹果、橘子”);
}
公共静态ProtocolMapperModel创建(字符串名称、布尔accessToken、布尔idToken、布尔userInfo){
ProtocolMapperModel映射器=新ProtocolMapperModel();
mapper.setName(名称);
setProtocolMapper(提供者ID);
setProtocol(OIDCLoginProtocol.LOGIN_协议);
Map config=newhashmap();
if(accessToken)config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN,“true”);
if(idToken)config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN,“true”);
if(userInfo)config.put(OIDCAttributeMapperHelper.INCLUDE_IN_userInfo,“true”);
setConfig(config);
返回映射器;
}
}

尝试在类的顶部添加
语句(
keydovetokenhancer
),并将类移动到包中

NPE从以下位置抛出:

String packageName=factory.getClass().getPackage().getName();
另见:

返回:
类的包,如果存档或代码库中没有可用的包信息,则为null


你的回答让我找到了一个更好的解决问题的方法。我现在觉得很傻。非常感谢。