Keycloak PhaseTwo:如何在Token中仅包含指定组织属性并格式化JSON
解决Keycloak PhaseTwo组织属性Token定制需求:仅保留指定属性并解析JSON格式
要实现只将expiryDate和解析为JSON格式的feature字段加入Token,可通过Keycloak的**脚本映射器(Script Mapper)**自定义Token内容,具体步骤如下:
1. 创建脚本映射器
- 登录Keycloak控制台,进入目标客户端的「Mappers」标签页,点击「Create」
- 选择「Script Mapper」类型,配置基础信息:
- Name:自定义名称(如「Custom Org Feature Claims」)
- Token Claim Name:自定义返回的字段名(如「org_features」)
- Claim JSON Type:选择「Object」(确保返回结构为JSON对象)
- 勾选需要生效的Token类型(如ID Token、Access Token)
2. 编写Groovy定制脚本
将以下脚本填入「Script」输入框,脚本会提取目标属性并解析feature字符串为JSON对象:
// 从Token现有数据中获取组织属性(若原属性存在于用户属性中,可替换为user.getAttributes().get("feature")?.get(0)) def orgFeatureData = token.getOtherClaims().get("feature") if (orgFeatureData) { // 取出目标组织(此处默认取第一个组织,可根据name/ID筛选特定组织) def targetOrg = orgFeatureData.values().first() if (targetOrg?.attributes) { def customClaims = [:] // 提取expiryDate属性(取数组第一个值) customClaims.expiryDate = targetOrg.attributes.expiryDate?.get(0) // 解析feature字符串为JSON对象 def featureStr = targetOrg.attributes.feature?.get(0) if (featureStr) { customClaims.feature = new groovy.json.JsonSlurper().parseText(featureStr) } return customClaims } } // 无数据时返回空对象 return [:]
3. 禁用原有组织属性映射器
找到之前配置的、会将完整组织属性加入Token的映射器,将其禁用,避免重复输出冗余数据。
额外说明
- 若存在多个组织,可在脚本中添加筛选逻辑(比如判断
targetOrg.name == "ASTER")来指定目标组织 - 确保Keycloak已启用脚本功能:检查服务器配置文件(如
standalone.xml)中是否设置了scriptingEnabled="true"
内容的提问来源于stack exchange,提问作者Prifulnath
相关产品推荐
相关产品推荐

