Keycloak JWT映射多值JSON数组属性出现转义符如何解决?
解决JWT中多值属性JSON字符串转义问题
问题原因
转义符出现是因为你的school属性值被系统识别为普通字符串而非JSON对象。JWT本身是JSON格式,当字符串里包含双引号时,会自动添加转义符来保证JSON结构的合法性。
解决方法
1. 修正用户属性的存储方式
- 手动添加属性时:别直接把JSON字符串粘贴到文本框,确认系统是否支持直接存储JSON对象。比如部分身份认证系统的后台有专门的JSON字段输入选项,而非普通文本输入。
- API导入用户时:确保请求体里
school的每个值是JSON对象,不是带引号的字符串。示例请求体:
{ "attributes": { "school": [ {"student_No":"1000","teacher_No":"50","male":"800","female":"250"}, {"student_No":"2000","teacher_No":"100","male":"1600","female":"500"} ] } }
2. 调整客户端范围的映射器配置(以Keycloak为例)
如果用户属性已经是字符串形式存储,通过自定义映射器解析:
- 删除原有普通属性映射器,新建Script Mapper(脚本映射器)
- 配置参数:
- 名称:自定义(如
school-json解析器) - 映射类型:选择
User Attribute - 属性名称:填
school
- 名称:自定义(如
- 脚本内容写入解析逻辑:
var schoolAttrs = user.getAttribute('school'); var parsedSchools = []; schoolAttrs.forEach(function(attr) { parsedSchools.push(JSON.parse(attr)); }); token.setClaim('school', parsedSchools);
- 保存后重新获取JWT,数组内就会是原生JSON对象,转义符消失。
其他身份认证系统的思路一致:找到映射器的自定义处理功能,添加字符串转JSON对象的解析步骤即可。
内容的提问来源于stack exchange,提问作者Max Ng
相关产品推荐
相关产品推荐

