Keycloak 向JWT添加声明的KeyClope协议映射程序获取空指针异常
我很难得到一个在Keyclope 6.0.1中工作的非常简单的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" => "
我正在尝试向访问令牌添加额外声明。当我将构建的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
你的回答让我找到了一个更好的解决问题的方法。我现在觉得很傻。非常感谢。