如何在Keycloak中为/{userid}/getEmail配置仅本人可访问策略
Keycloak 接口所有权访问控制配置方案
前置说明:要让路径参数校验生效,你的API服务或者前置网关必须集成Keycloak的策略执行器(Policy Enforcer),且配置开启路径参数透传,否则Keycloak拿不到URI里的
{userid}值,策略无法正常判断。
1. 注册受保护的接口资源
- 进入你要配置的Realm管理控制台,打开对接API鉴权的对应客户端详情页,切换到「Authorization」→「Resources」标签
- 点击创建资源,按下面填配置:
- 名称:填
Own Email Query Resource,方便后续识别就行 - URI列表:添加
/{userid}/getEmail,如果要限定请求方法,就只勾选GET,和你的接口实际方法对齐 - 其余配置保持默认,直接保存
- 名称:填
2. 创建用户身份匹配策略
最稳定的实现方式是用Keycloak内置的JavaScript策略,逻辑透明不容易配错:
- 切到「Authorization」→「Policies」标签,策略类型下拉选「JavaScript」,新建策略
- 名称填
Self Email Access Check Policy - 策略逻辑区直接贴下面的代码:
// 取当前发起请求的登录用户ID const requestUserId = $evaluation.context.identity.user.id; // 从请求上下文取路径里的userid参数,参数名必须和URI模板里的占位符完全一致 const pathUserId = $evaluation.context.attributes['request.pathParam.userid']?.[0]; // 两个ID完全相等时放行,其余场景全部拒绝 $evaluation.grantIf(() => requestUserId === pathUserId);
- 填完直接保存即可。
3. 绑定资源和策略生成权限
- 切到「Authorization」→「Permissions」标签,新建「Resource-based Permission」
- 名称填
Query Own Email Permission - 关联资源选第一步创建的
Own Email Query Resource - 关联策略选第二步创建的
Self Email Access Check Policy - 决策策略选「Affirmative」,其余配置留默认,保存
- 如果你的Policy Enforcer开了懒加载,记得同步下配置或者重启下服务/网关让配置生效。
效果验证
- 携带用户A的有效token请求
/A的用户ID/getEmail,可以正常访问接口 - 携带用户A的有效token请求
/B的用户ID/getEmail,会直接返回403未授权,符合预期。
常见踩坑点
- 如果校验一直不生效,先查适配器配置,部分老版本Keycloak适配器默认不会透传路径参数,需要在policy-enforcer配置段加
path-parameters: true开启 - 不要给这个资源绑定其他放行类策略(比如管理员全通策略、公开访问策略),会绕过所有权校验逻辑。
内容的提问来源于stack exchange,提问作者Murat Karagozgil
相关产品推荐
相关产品推荐

