我基于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自动调用(为了清楚起见,自定义映射器在没有它的情况下也可以工作,但是您不能配置multivalue,并且声明将只显示列表中的第一个项目)。它允许将multivalue属性设置为true,这样我们就可以返回一个列表。