如何配置自定义 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 一个列表。