Keycloak的Permissions与Policy仅在Evaluate页生效,授权码流无authorization字段问题
Keycloak 角色关联Scope授权配置不生效解决方案
功能正确使用逻辑
- Keycloak Authorization模块的权限评估逻辑和标准OAuth2授权码流程是相互独立的:Evaluate标签页是主动触发的单次权限模拟评估,默认不会自动将评估结果注入到授权码流程返回的标准ID Token/Access Token中。
- 你需要实现的「登录时根据用户角色自动授予对应Scope并返回」的需求,需要手动将细粒度授权评估能力和标准OAuth授权流程做绑定,显式触发评估并将结果写入指定Token字段。
遗漏配置项排查清单
1. 客户端基础授权配置校验
- 确认客户端配置页的
Authorization Enabled开关保持开启,同时进入Authorization Settings页,确认Policy Enforcement Mode设置为PERMISSIVE(调试阶段建议用这个值,生产可以换成ENFORCING),不要设置为DISABLED。 - 确认你创建的需要关联角色的Scope是授权范围(Authorization Scope),而非普通OAuth客户端Scope,且该Scope已经和对应资源绑定、权限规则也同时关联了该Scope和基于角色的匹配策略。
2. 授权码流程请求参数补全
走授权码流程请求授权端点时,必须补充以下参数:
scope参数除了常规的openid等基础Scope外,需要包含你自定义的授权Scope。- 额外添加
permission参数:如果需要申请所有绑定的资源和Scope,直接传permission=*;如果只需要申请指定资源的指定Scope,格式为permission=资源ID#ScopeID。 - 注意Keycloak 18及以上版本需要先进入
Realm Settings->Security Defenses->Brute Force Detection,将permission参数加入到允许参数列表,避免请求被拦截。
3. 授权结果Token映射配置
如果要让权限评估结果出现在返回的Token中,需要添加自定义协议映射器:
- 进入客户端配置页->
Mappers->点击Create,Mapper Type选择Authorization Permissions。 - 配置
Token Claim Name为authorization,勾选Add to access token选项,可按需选择是否将该字段加入ID Token、用户信息端点返回结果。 - 保存配置后需要重新走完整授权码流程获取新Token,才能看到字段生效。
4. 配置正确性验证
如果完成以上配置后仍然不生效,可以先调用权限评估接口验证授权规则本身是否正确:
用用户的有效Access Token调用POST请求到Keycloak的Token端点,请求Body参数如下:
grant_type=urn:ietf:params:oauth:grant-type:uma-ticket audience=你的客户端ID permission=* response_mode=permissions
如果该接口能返回你预期的Scope列表,说明授权规则配置正确,问题出在请求参数或映射器配置上;如果返回空结果,重新检查资源、Scope、策略、权限的绑定关联关系。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

