如何在 Keycloak 中创建脚本映射器?
Posted
技术标签:
【中文标题】如何在 Keycloak 中创建脚本映射器?【英文标题】:How to create a Script Mapper in Keycloak? 【发布时间】:2019-03-02 06:22:08 【问题描述】:我需要在 Keycloak 中创建一个脚本映射器类型的协议映射器。该脚本应该获取用户属性,检查其大小,并将其放在令牌上。我没有找到有关如何创建脚本的文档或示例。从我能收集到的点点滴滴,我想我的脚本需要看起来像:
var value = user.getAttribute("myAttribute");
if (value.length > LIMIT)
value = value.substring(0,LIMIT);
token.setOtherClaims("myAttribute",value);
是这样吗?我编造了 user.getAttribute("myAttribute")。是否有可以找到如何获取 Keycloak 用户属性的文档来源?
脚本是否需要返回任何内容?
欢迎任何帮助。
【问题讨论】:
【参考方案1】:通过查看这里的 keycloak 源可以理解 Script Mappers 的魔力:Source
脚本可以像这样使用exports变量返回一些东西
exports = "Claim Value"
不同的类型:
用户:SourceJavaDoc 领域:SourceJavaDoc 令牌:SourceJavaDoc 用户会话:SourceJavaDoc keycloakSession: Source JavaDoc这是一个示例脚本:
// you can set standard fields in token
token.setAcr("test value");
// you can set claims in the token
token.getOtherClaims().put("claimName", "claim value");
// multi-valued claim (thanks to @ErwinRooijakkers)
token.getOtherClaims().put('foo', Java.to(['bars'], "java.lang.String[]"))
// 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;
希望对你有帮助!
【讨论】:
您知道是否有一种方法可以从脚本映射器访问 HTTP 标头,以便您可以从标头中提取值以作为声明插入? 你的意思是这样的:***.com/questions/47233720/…? 这很简单。谢谢。 绝对漂亮,正是我想要的。 我正是这样做的(在 10.0.2 中),但我添加的映射器没有显示在 GUI 中。它应该在内置映射器下吗?【参考方案2】:我需要这个功能,但在我新安装的 10.0.2 中找不到这个“脚本映射器”。原来默认情况下它没有启用,如这里的文档中所示:https://www.keycloak.org/docs/latest/server_installation/#profiles
要启用它,您可以:
使用feature.scripts=enabled
创建文件standalone/configuration/profile.properties
或
用bin/standalone.sh|bat -Dkeycloak.profile.feature.scripts=enabled
启动服务器
似乎来自the source code
public boolean isSupported()
return Profile.isFeatureEnabled(Profile.Feature.SCRIPTS) && Profile.isFeatureEnabled(Profile.Feature.UPLOAD_SCRIPTS);
upload_scripts
应该同样启用
希望对大家有所帮助
【讨论】:
感谢您的评论,我想它也找到了您的帖子:-)。文档说我们不应该在生产中启用脚本上传,但我们应该在服务器上部署脚本:keycloak.org/docs/latest/server_development/…以上是关于如何在 Keycloak 中创建脚本映射器?的主要内容,如果未能解决你的问题,请参考以下文章
keycloak 客户端协议映射器(脚本映射器)将请求标头添加到令牌中
keycloak - 使用 kcadm.sh 将协议映射器添加到 keycloak