如何向Keycloak的EvaluationContext传递额外参数?
能否通过Evaluation Context传递额外属性实现地理位置策略?
是的,现在完全可以实现这个需求!结合Keycloak授权服务的功能,你可以把客户端传递的运行时属性(比如国家代码)注入到Evaluation Context中,用于JavaScript策略的判断。
背景补充
2017年的时候确实没有这个能力,当时核心团队已经在规划相关支持;后续通过KEYCLOAK-5457的迭代,Keycloak完善了授权上下文的属性注入能力,现在最便捷的方式是使用**Claim Information Point(CIP)**来实现。
实现步骤
配置Claim Information Point注入属性
在Keycloak管理控制台中,找到你的资源服务器,进入Authorization->Claim Information Points,添加一个新的CIP:- 根据你的客户端传递方式选择来源(比如HTTP请求头、请求参数)
- 设置提取规则(比如从请求头
X-Country-Code提取) - 定义属性名称为
notkc.country_of_origin(和你的策略代码对应) - 关联这个CIP到你的目标策略或资源,确保评估时会自动注入属性
调整JavaScript策略代码
修正原代码的语法问题后,策略可以直接从Evaluation Context中获取属性:var context = $evaluation.getContext(); var attributes = context.getAttributes(); var countryCode = attributes.getValue('notkc.country_of_origin'); var VALID_COUNTRIES = ['US', 'CA', 'GB']; // 根据你的需求修改允许的国家列表 // 检查国家代码是否在允许范围内 if (VALID_COUNTRIES.indexOf(countryCode) > -1) { $evaluation.grant(); } else { $evaluation.deny(); }
注意事项
- 确保客户端正确传递属性(比如通过HTTP头、请求参数等方式),和CIP的配置匹配
- 如果你是直接在授权请求中传递参数,也可以配置CIP从授权请求的参数中提取,灵活调整即可
内容的提问来源于stack exchange,提问作者milan
相关产品推荐
相关产品推荐

