Keycloak向RPT令牌添加permission自定义claims时访问被拒绝
问题根因
这个访问拒绝问题的核心原因是Keycloak Policy Enforcer的默认权限匹配逻辑:当RPT令牌的authorization.permissions节点下存在claims字段时,Enforcer不会直接忽略自定义内容,而是自动触发权限声明强校验——它会默认把permission下所有claims都当成当前权限的生效约束条件,和当前请求上下文、服务端授权策略要求的声明做全量匹配,只要存在未在Keycloak授权策略中定义的未知claims,就会直接判定权限不匹配返回DENY,不会走到后续的资源、scope匹配流程。
另外你注入的自定义claims值格式也存在问题:当前customers:view:country对应的数组值是"[Belgium]",多了一层外层方括号,Keycloak原生生成的声明数组元素是纯字符串值,这个格式异常也会加剧匹配失败的问题。
解决方案
你可以根据自己的需求选对应方案:
- 方案1:全局关闭claims校验(完全匹配你的预期逻辑)
在application.properties中添加如下配置,直接禁用Policy Enforcer的声明信息点(CIP)解析与校验逻辑,配置生效后Enforcer只会校验RPT中的资源、scope是否匹配请求要求,完全忽略permission节点下的所有自定义claims内容:
配置添加后重启应用即可生效,只要RPT中携带keycloak.policy-enforcer-config.claim-information-point-resolver-enabled=falsecustomers资源的viewscope,就算带自定义claims也能正常通过校验。 - 方案2:适配原生校验逻辑保留claims校验能力
如果你后续需要基于自定义claims做细粒度权限控制,就不要直接通过RPT签发SPI硬插claims,改用Keycloak官方提供的Claim Information Point SPI注入自定义声明,同时修正claims值格式,把"[Belgium]"改成纯字符串"Belgium",让Enforcer能识别到对应的声明匹配规则,就不会出现误拦截。
内容的提问来源于stack exchange,提问作者Ertu
相关产品推荐
相关产品推荐

