我需要在Keycloak中创建“脚本映射器”类型的协议映射器。该脚本应获取用户属性,检查其大小,并将其放在令牌上。我没有找到有关如何创建脚本的文档或示例。从我收集的点点滴滴来看,我想我的脚本需要看起来像这样:
var value = user.getAttribute("myAttribute");
if (value.length > LIMIT) {
value = value.substring(0,LIMIT);
}
token.setOtherClaims("myAttribute",value);
答案 0 :(得分:6)
我需要此功能,但在我刚安装的10.0.2中找不到此“脚本映射器”。事实证明,默认情况下未启用它,如此处的文档所示:https://www.keycloak.org/docs/latest/server_installation/#profiles
要启用它,您可以:
standalone/configuration/profile.properties
创建文件feature.scripts=enabled
或
bin/standalone.sh|bat -Dkeycloak.profile.feature.scripts=enabled
启动服务器public boolean isSupported() {
return Profile.isFeatureEnabled(Profile.Feature.SCRIPTS) && Profile.isFeatureEnabled(Profile.Feature.UPLOAD_SCRIPTS);
}
upload_scripts
应该同样启用
我希望它将对某人有所帮助
答案 1 :(得分:5)
可以通过查看以下{@ {3}}
的密钥隐藏源来理解脚本映射器的魔力。该脚本可以通过使用此类exports变量返回某些内容
exports = "Claim Value"
不同的类型:
这是一个示例脚本:
// you can set standard fields in token
token.setAcr("test value");
// you can set claims in the token
token.getOtherClaims().put("claimName", "claim value");
// work with variables and return multivalued token value
var ArrayList = Java.type("java.util.ArrayList");
var roles = new ArrayList();
var client = keycloakSession.getContext().getClient();
var forEach = Array.prototype.forEach;
forEach.call(user.getClientRoleMappings(client).toArray(), function(roleModel) {
roles.add(roleModel.getName());
});
exports = roles;
希望有帮助!