能否在Keycloak签发的JWT令牌中存储自定义信息?
Keycloak JWT添加自定义字段实现方法
完全可以在Keycloak签发的JWT令牌中加入自定义字段,不需要额外查询数据库,根据你的场景选下面两种实现方式即可。
零代码实现:用户属性+内置协议映射器
适合存储用户居住地址这类固定的用户属性,不需要写任何代码,控制台配置完就能用:
- 配置用户自定义属性
进入对应Realm的管理控制台,打开「Users」菜单找到目标用户,切换到「Attributes」页签,新增属性:Key填address,Value填用户的实际居住地址,保存即可。 - 配置令牌Claim映射
- 打开「Clients」菜单,选中你当前使用的客户端(即你解码出的token里
azp字段对应的MyProject) - 切换到「Client Scopes」页签,点击该客户端对应的专用scope(命名规则一般为
[客户端ID]-dedicated) - 点击「Add Mapper」→「By Configuration」,选择「User Attribute」类型的映射器
- 按提示填配置项:
- Name:自定义即可,比如
用户居住地址映射 - User Attribute:填刚才给用户加的属性Key,即
address - Token Claim Name:填你希望在JWT payload里显示的字段名,比如直接填
address - Claim JSON Type:字符串类型选
String即可,如果是结构化地址(省/市/区/街道拆分)选JSON - 打开「Add to access token」开关,如果需要同时把字段加到ID Token、UserInfo接口响应里,对应打开其他开关即可
- Name:自定义即可,比如
- 打开「Clients」菜单,选中你当前使用的客户端(即你解码出的token里
- 保存配置后,重新走登录流程获取新的access_token,解码后就能看到自定义的地址字段了。
复杂场景实现:自定义协议映射器
如果要加的字段不是简单存储的用户属性,需要做逻辑计算、关联多份数据生成(比如用户的动态权限集合、多端关联信息),可以用Keycloak的SPI能力实现自定义映射器:
- 按照Keycloak的SPI规范实现
OIDCProtocolMapper接口,在实现类里写自定义字段的生成逻辑,不管是查Keycloak内置存储还是关联外部数据源都可以 - 把实现好的代码打包为jar包,放到Keycloak部署目录的
providers文件夹下,重启Keycloak完成加载 - 后续配置流程和上面的内置映射器一致,添加Mapper时可以直接选到你自定义的实现,配置后签发的token就会自动带上你生成的自定义字段。
注意事项:JWT仅做Base64编码,没有加密能力,绝对不要在令牌中存储敏感信息,任何拿到token的人都可以直接解码看到所有内容。另外不要在token里塞体积过大的内容,否则会导致请求头超出大小限制,拖慢接口传输性能。
内容的提问来源于stack exchange,提问作者Talenel
相关产品推荐
相关产品推荐

