Keycloak中推送Claims至Regex策略及身份属性映射问题
问题:Keycloak v21.0.1中推送Claims到身份属性用于Regex策略评估
我在Keycloak v21.0.1里尝试给token端点推送Claims,用来做基于Regex的策略评估,同时设置response_mode=permissions直接拿评估结果。和Stack Overflow上已有的解答不同,我不需要用JavaScript策略,只针对Regex策略。
目前发送请求后,响应里能看到推送的Claims,但Regex策略就是不触发。翻源码发现,这类策略要求Claims得在evaluation.getContext().getIdentity().getAttributes()里,但我测试时getClaimValue(evaluation, policy)一直返回null。想问下有没有办法把推送的Claims映射到策略评估时的身份属性里?
解决方案
用客户端范围(Client Scope)映射推送的Claims
- 新建一个客户端范围,进入该范围的Mappers标签页,添加一个
User Attribute类型的映射器 - 映射器配置里,把你推送的Claim名称填到
User Attribute字段,Token Claim Name也设成一样的值,同时勾选Add to ID token和Add to access token(按需选择) - 把这个客户端范围关联到你用来做策略评估的客户端上
这样操作后,推送的Claims会被映射到用户身份的属性集合里,Regex策略就能读取到了
- 新建一个客户端范围,进入该范围的Mappers标签页,添加一个
自定义SPI扩展(进阶方案)
如果客户端范围的方式满足不了需求,可以自己写个Keycloak SPI扩展:- 实现
AuthorizationProviderFactory和AuthorizationProvider接口 - 在
evaluate方法里,从请求上下文提取推送的Claims,手动加到evaluation.getContext().getIdentity().getAttributes()里 - 把扩展打包后放到Keycloak的
providers目录,重启Keycloak就能生效
- 实现
验证配置是否生效
配置完成后,发送带推送Claims的请求,同时把Keycloak的org.keycloak.authorization日志级别设为DEBUG,查看日志里evaluation.getContext().getIdentity().getAttributes()是否包含目标Claims,确认Regex策略能正确读取到值
内容的提问来源于stack exchange,提问作者wojja
相关产品推荐
相关产品推荐

