如何配置自定义 Keycloak 令牌映射器以允许多值值
How to configure a custom Keycloak token mapper to allow multivalued value
我创建了一个基于 https://github.com/dasniko/keycloak-tokenmapper-example 的自定义 Keycloak 令牌映射器。
但是,就我而言,我想向自定义声明中添加一个值列表。
如果我将列表传递给 mapClaim
,它只使用列表的第一个元素:
List<MyObject> myList = ...
OIDCAttributeMapperHelper.mapClaim(token, mappingModel, myList);
解决方法是在自定义AbstractOIDCProtocolMapper
子类中添加静态create
方法:
public class MyCustomTokenMapper extends AbstractOIDCProtocolMapper
implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {
...
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<>();
config.put(ProtocolMapperUtils.MULTIVALUED, Boolean.TRUE.toString()); // Set the MULTIVALUED config
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;
}
}
此静态方法在存在时由 Keycloak 自动调用(为清楚起见,自定义映射器在没有它的情况下也可以工作,但您无法配置 MULTIVALUED 并且声明只会显示列表中的第一项) .它允许将 MULTIVALUED 属性设置为 true,这样我们就可以 return 一个列表。
我创建了一个基于 https://github.com/dasniko/keycloak-tokenmapper-example 的自定义 Keycloak 令牌映射器。
但是,就我而言,我想向自定义声明中添加一个值列表。
如果我将列表传递给 mapClaim
,它只使用列表的第一个元素:
List<MyObject> myList = ...
OIDCAttributeMapperHelper.mapClaim(token, mappingModel, myList);
解决方法是在自定义AbstractOIDCProtocolMapper
子类中添加静态create
方法:
public class MyCustomTokenMapper extends AbstractOIDCProtocolMapper
implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {
...
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<>();
config.put(ProtocolMapperUtils.MULTIVALUED, Boolean.TRUE.toString()); // Set the MULTIVALUED config
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;
}
}
此静态方法在存在时由 Keycloak 自动调用(为清楚起见,自定义映射器在没有它的情况下也可以工作,但您无法配置 MULTIVALUED 并且声明只会显示列表中的第一项) .它允许将 MULTIVALUED 属性设置为 true,这样我们就可以 return 一个列表。