Keycloak登录后Tomcat返回403拒绝授权错误该如何解决
排查解决步骤
- 第一步:核对Keycloak角色映射配置
你给用户分配的user角色分为Realm全局角色和客户端专属角色两类,对应配置要求不同:- 若使用Realm级
user角色:进入Keycloak控制台对应客户端的「作用域」配置页,确认「全范围作用域」开关已开启,或手动将Realm级user角色添加到该客户端的作用域映射列表中 - 若使用客户端级
user角色:确认你给用户分配的是当前Tomcat应用对应的Keycloak客户端下的user角色,而非其他客户端的同名角色
- 若使用Realm级
- 第二步:核对
keycloak.json配置
如果你使用的是客户端级角色,必须在应用的WEB-INF/keycloak.json中添加以下配置,否则适配器默认只会读取Realm级角色:"use-resource-role-mappings": true - 第三步:核对Tomcat适配器安装配置
确认Keycloak Tomcat 8适配器的所有jar包已放到Tomcat根目录的lib文件夹下,不要放到应用自身的WEB-INF/lib中避免冲突;同时检查Tomcatconf/context.xml中已添加安全阀门配置:
同时确认<Valve className="org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve"/>server.xml、应用的META-INF/context.xml中没有配置其他自定义Realm覆盖Keycloak适配器的认证逻辑 - 第四步:核对角色名称一致性
Keycloak角色名称大小写敏感,确认Realm/客户端中的角色名、web.xml中的role-name完全一致,无多余空格、大小写偏差 - 第五步:开启DEBUG日志定位问题
在Tomcat的conf/logging.properties中添加以下配置,重启后触发登录,查看日志中用户登录后获取到的角色列表是否包含user:
若列表中无org.keycloak.adapters.level = FINEuser则问题出在Keycloak端的角色映射配置,若列表中有user则需排查web.xml是否有其他未公开的安全约束冲突
内容的提问来源于stack exchange,提问作者Michael Goppelt
相关产品推荐
相关产品推荐

