Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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
Java 检索令牌时无法获取要调用的KeyClope协议映射程序_Java_Keycloak_Mapper_Keycloak Services - Fatal编程技术网

Java 检索令牌时无法获取要调用的KeyClope协议映射程序

Java 检索令牌时无法获取要调用的KeyClope协议映射程序,java,keycloak,mapper,keycloak-services,Java,Keycloak,Mapper,Keycloak Services,Keyclope 7.3.0GA服务器 使用库密钥斗篷服务3.4.3 我们的团队在令牌调用期间调用KeyClope协议映射程序时遇到问题: 映射程序在启动时注册,并可在我们客户的映射程序列表中找到 我们在KC UI中为客户机添加映射器 当我尝试“评估”选项卡时,自定义映射器(Stackoverflow自定义映射器)在列表中显示为“有效协议映射器”之一 然而,映射器似乎不是从Java端调用的,我在日志中什么也看不到 此时,我们只希望看到transformAccessToken的日志语句和我们添加

Keyclope 7.3.0GA服务器

使用库密钥斗篷服务3.4.3

我们的团队在令牌调用期间调用KeyClope协议映射程序时遇到问题:

  • 映射程序在启动时注册,并可在我们客户的映射程序列表中找到
  • 我们在KC UI中为客户机添加映射器
  • 当我尝试“评估”选项卡时,自定义映射器(Stackoverflow自定义映射器)在列表中显示为“有效协议映射器”之一
  • 然而,映射器似乎不是从Java端调用的,我在日志中什么也看不到
  • 此时,我们只希望看到
    transformAccessToken
    的日志语句和我们添加的测试声明
“评估”选项卡:

Java代码:

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

public static final String PROVIDER_ID = "oidc-customprotocolmapper";
private static Logger logger = Logger.getLogger(SoamProtocolMapper.class);

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

@Override
public List<ProviderConfigProperty> getConfigProperties() {
    logger.info("SOAM: inside getConfigProperties");
    return configProperties;
}

@Override
public String getDisplayCategory() {
    logger.info("SOAM: inside getDisplayCategory");
    return TOKEN_MAPPER_CATEGORY;
}

@Override
public String getDisplayType() {
    logger.info("SOAM: inside getDisplayType");
    return "Stackoverflow Custom Protocol Mapper";
}

@Override
public String getId() {
    logger.info("SOAM: inside getId");
    return PROVIDER_ID;
}

@Override
public String getHelpText() {
    logger.info("SOAM: inside getHelpText");
    return "some help text";
}

@Override
public AccessToken transformAccessToken(AccessToken token, ProtocolMapperModel mappingModel, KeycloakSession session,
        UserSessionModel userSession, AuthenticatedClientSessionModel clientSession) {
    logger.info("SOAM: inside transformAccessToken");
    token.getOtherClaims().put("stackoverflowCustomToken", "stackoverflow");

    setClaim(token, mappingModel, userSession, session);
    return token;
}

public static ProtocolMapperModel create(String name, boolean accessToken, boolean idToken, boolean userInfo) {
    logger.info("SOAM: inside create");
    ProtocolMapperModel mapper = new ProtocolMapperModel();
    mapper.setName(name);
    mapper.setProtocolMapper(PROVIDER_ID);
    mapper.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
    Map<String, String> config = new HashMap<String, String>();
    mapper.setConfig(config);
    return mapper;
}}
公共类SoamProtocolMapper扩展了AbstractOIDCProtocolMapper实现了OIDCAccessTokenMapper、OIDCIDTokenMapper、UserInfoTokenMapper{
公共静态最终字符串提供程序\u ID=“oidc customprotocolmapper”;
私有静态记录器Logger=Logger.getLogger(soamprotocolapper.class);
私有静态最终列表configProperties=new ArrayList();
@凌驾
公共列表getConfigProperties(){
info(“SOAM:insidegetconfigproperties”);
返回配置属性;
}
@凌驾
公共字符串getDisplayCategory(){
logger.info(“SOAM:内部getDisplayCategory”);
返回令牌映射器类别;
}
@凌驾
公共字符串getDisplayType(){
info(“SOAM:insidegetdisplaytype”);
返回“Stackoverflow自定义协议映射器”;
}
@凌驾
公共字符串getId(){
logger.info(“SOAM:insidegetid”);
返回提供者ID;
}
@凌驾
公共字符串getHelpText(){
info(“SOAM:insidegethelptext”);
返回“一些帮助文本”;
}
@凌驾
公共AccessToken transformAccessToken(AccessToken令牌、ProtocolMapperModel映射模型、KeyDoveSession会话、,
UserSessionModel userSession,AuthenticatedClientSessionModel clientSession){
logger.info(“SOAM:内部transformAccessToken”);
token.getOtherClaims().put(“stackoverflowCustomToken”、“stackoverflow”);
setClaim(令牌、映射模型、用户会话、会话);
返回令牌;
}
公共静态ProtocolMapperModel创建(字符串名称、布尔accessToken、布尔idToken、布尔userInfo){
logger.info(“SOAM:内部创建”);
ProtocolMapperModel映射器=新ProtocolMapperModel();
mapper.setName(名称);
setProtocolMapper(提供者ID);
setProtocol(OIDCLoginProtocol.LOGIN_协议);
Map config=newhashmap();
setConfig(config);
返回映射器;
}}

任何有帮助的-谢谢

回答我自己的问题。
静态
创建
初始化方法中缺少几行代码。以下是一个工作示例:

package com.github.bcgov.keycloak.soam;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.oidc.OIDCLoginProtocol;
import org.keycloak.protocol.oidc.mappers.AbstractOIDCProtocolMapper;
import org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper;
import org.keycloak.protocol.oidc.mappers.OIDCAttributeMapperHelper;
import org.keycloak.protocol.oidc.mappers.OIDCIDTokenMapper;
import org.keycloak.protocol.oidc.mappers.UserInfoTokenMapper;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.IDToken;


/**
 * SOAM Protocol Mapper
 */
public class SoamProtocolMapper extends AbstractOIDCProtocolMapper implements     OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {

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

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

public static final String PROVIDER_ID = "oidc-soam-mapper";


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

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

@Override
public String getDisplayType() {
    return "Soam Protocol Mapper";
}

@Override
public String getDisplayCategory() {
    return TOKEN_MAPPER_CATEGORY;
}

@Override
public String getHelpText() { 
    return "Map SOAM claims";
}

protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession) {
    token.getOtherClaims().put("test_claim", "Working!");
}

public static ProtocolMapperModel create(String name,
                                  String tokenClaimName,
                                  boolean consentRequired, String consentText,
                                  boolean accessToken, boolean idToken) {
    ProtocolMapperModel mapper = new ProtocolMapperModel();
    mapper.setName(name);
    mapper.setProtocolMapper(PROVIDER_ID);
    mapper.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
    mapper.setConsentRequired(consentRequired);
    mapper.setConsentText(consentText);
    Map<String, String> config = new HashMap<String, String>();
    config.put(OIDCAttributeMapperHelper.TOKEN_CLAIM_NAME, tokenClaimName);
    if (accessToken) config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
    if (idToken) config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
    mapper.setConfig(config);

    return mapper;
}
package com.github.bcgov.keydove.soam;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入org.keydepate.models.ProtocolMapperModel;
导入org.keydape.models.UserSessionModel;
导入org.keydape.protocol.oidc.OIDCLoginProtocol;
导入org.keydepot.protocol.oidc.mappers.AbstractOIDCProtocolMapper;
导入org.keydape.protocol.oidc.mappers.OIDCAccessTokenMapper;
导入org.keydepate.protocol.oidc.mappers.OIDCAttributeMapperHelper;
导入org.keydape.protocol.oidc.mappers.OIDCIDTokenMapper;
导入org.keydape.protocol.oidc.mappers.UserInfoTokenMapper;
导入org.keydepot.provider.ProviderConfigProperty;
导入org.keydeport.representations.IDToken;
/**
*SOAM协议映射器
*/
公共类SoamProtocolMapper扩展了AbstractOIDCProtocolMapper实现了OIDCAccessTokenMapper、OIDCIDTokenMapper、UserInfoTokenMapper{
私有静态最终列表configProperties=new ArrayList();
静止的{
OIDCAttributeMapperHelper.addTokenClaimNameConfig(configProperties);
OIDCAttributeMapperHelper.AddIncludeInokensConfig(configProperties,SoamProtocolMapper.class);
}
公共静态最终字符串提供程序\u ID=“oidc soam映射程序”;
公共列表getConfigProperties(){
返回配置属性;
}
@凌驾
公共字符串getId(){
返回提供者ID;
}
@凌驾
公共字符串getDisplayType(){
返回“Soam协议映射器”;
}
@凌驾
公共字符串getDisplayCategory(){
返回令牌映射器类别;
}
@凌驾
公共字符串getHelpText(){
返回“MAPSOAM索赔”;
}
受保护的void setClaim(IDToken令牌、ProtocolMapperModel映射模型、UserSessionModel userSession){
token.getOtherClaims().put(“test_claim”,“Working!”);
}
公共静态ProtocolMapperModel创建(字符串名称,
字符串tokenClaimName,
需要布尔同意,字符串同意文本,
布尔访问令牌,布尔idToken){
ProtocolMapperModel映射器=新ProtocolMapperModel();
mapper.setName(名称);
setProtocolMapper(提供者ID);
setProtocol(OIDCLoginProtocol.LOGIN_协议);
映射器。需要设置许可(需要许可);
mapper.setApproventText(ApproventText);
Map config=newhashmap();
config.put(OIDCAttributeMapperHelper.TOKEN\u CLAIM\u NAME,tokenClaimName);
if(accessToken)config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN,“true”);
if(idToken)config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN,“true”);
setConfig(config);
返回映射器;
}

}

您好,现在Keyclope 7.4也出现了同样的问题。问题,何时调用create方法?此外,ProtocolMapperModel.SetApproveRequired和ProtocolMapperModel.SetApproveText方法不存在;我们不必对代码库进行任何更改(按预期工作)。我不确定调用堆栈中create方法的位置。