You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus启用Keycloak策略执行器后公共资源加载报错,如何排除?

问题

使用Quarkus 3.3.2,通过Keycloak Bearer Token保护部分API,核心配置如下:

# keycloak
# OIDC Configuration
%prod.quarkus.oidc.auth-server-url=https://keycloak....
%test.quarkus.oidc.auth-server-url=https://keycloak....
%dev.quarkus.oidc.auth-server-url=https://keycloak....
quarkus.oidc.client-id=my-client
%prod.quarkus.oidc.credentials.secret=...
%test.quarkus.oidc.credentials.secret=...
%dev.quarkus.oidc.credentials.secret=...
quarkus.oidc.tls.verification=required
quarkus.keycloak.policy-enforcer.enable=true

启用quarkus.keycloak.policy-enforcer.enable=true后,AuthzClient功能正常,但请求公共资源(如健康检查、/css/enunciate.css等)时触发错误:

2023-09-25 16:31:02,956 ERROR [org.key.ada.aut.PolicyEnforcer] (vert.x-worker-thread-1) Could not lazy load resource with path [/css/enunciate.css] from server: org.keycloak.authorization.client.AuthorizationDeniedException: org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 403 / Forbidden / Response from server: {"error":"invalid_clientId","error_description":"Client application [my-client] is not registered as a resource server."}
    at org.keycloak.authorization.client.util.Throwables.handleAndWrapHttpResponseException(Throwables.java:96)
    at org.keycloak.authorization.client.util.Throwables.handleWrapException(Throwables.java:42)
    at org.keycloak.authorization.client.util.Throwables.retryAndWrapExceptionIfNecessary(Throwables.java:87)
    at org.keycloak.authorization.client.resource.ProtectedResource.find(ProtectedResource.java:233)
    at org.keycloak.authorization.client.resource.ProtectedResource.findByMatchingUri(ProtectedResource.java:292)
    at org.keycloak.adapters.authorization.PathConfigMatcher.matches(PathConfigMatcher.java:81)
    ...
Caused by: org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 403 / Forbidden / Response from server: {"error":"invalid_clientId","error_description":"Client application [my-client] is not registered as a resource server."}
    at org.keycloak.authorization.client.util.HttpMethod.execute(HttpMethod.java:103)
    at org.keycloak.authorization.client.util.HttpMethodResponse$3.execute(HttpMethodResponse.java:68)
    at org.keycloak.authorization.client.resource.ProtectedResource$5.call(ProtectedResource.java:227)
    at org.keycloak.authorization.client.resource.ProtectedResource$5.call(ProtectedResource.java:223)
    at org.keycloak.authorization.client.resource.ProtectedResource.find(ProtectedResource.java:231)
    ... 19 more

尝试配置公共资源权限无效:

quarkus.http.auth.permission.public.paths=/,/css/enunciate.css,/favicon.ico
quarkus.http.auth.permission.public.policy=permit
quarkus.http.auth.permission.public.methods=GET,HEAD,POST,PUT,OPTION,PATCH

尝试指定需认证路径导致启动失败:

quarkus.keycloak.policy-enforcer.paths.1.path=/tlnv-restservice/api,/tlnv-restservice/api/*
quarkus.keycloak.policy-enforcer.paths.1.enforcement-mode=ENFORCING

启动错误日志:

2023-09-25 16:37:31,775 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application (with profile [dev]): java.lang.RuntimeException: Failed to start quarkus
    at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
    ... 
Caused by: org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 403 / Forbidden / Response from server: {"error":"invalid_clientId","error_description":"Client application [my-client] is not registered as a resource server."}
    at org.keycloak.authorization.client.util.HttpMethod.execute(HttpMethod.java:103)
    at org.keycloak.authorization.client.util.HttpMethodResponse$3.execute(HttpMethodResponse.java:68)
    at org.keycloak.authorization.client.resource.ProtectedResource$5.call(ProtectedResource.java:227)
    at org.keycloak.authorization.client.resource.ProtectedResource$5.call(ProtectedResource.java:223)
    at org.keycloak.authorization.client.resource.ProtectedResource.find(ProtectedResource.java:231)
    ... 23 more

需解决:如何排除公共资源,使其不被Keycloak策略执行器加载?

解决方案

1. 配置策略执行器的排除路径

直接在Keycloak策略执行器配置中添加需要排除的公共资源,设置其enforcement-mode为DISABLED,且排除规则需放在强制规则前面(策略执行器按顺序匹配路径):

quarkus.keycloak.policy-enforcer.paths.0.path=/,/css/*,/favicon.ico,/health/*
quarkus.keycloak.policy-enforcer.paths.0.enforcement-mode=DISABLED

quarkus.keycloak.policy-enforcer.paths.1.path=/tlnv-restservice/api/*
quarkus.keycloak.policy-enforcer.paths.1.enforcement-mode=ENFORCING

2. 修正Keycloak客户端配置

启动报错的核心原因是my-client未在Keycloak中注册为资源服务器,需在Keycloak控制台操作:

  • 进入对应客户端的设置页面
  • 开启Authorization Enabled选项
  • 保存后重启应用

3. 调整HTTP权限策略优先级(可选)

若需使用quarkus.http.auth.permission配置,需确保公共权限优先级高于Keycloak认证权限,通过priority参数设置:

quarkus.http.auth.permission.public.paths=/,/css/*,/favicon.ico,/health/*
quarkus.http.auth.permission.public.policy=permit
quarkus.http.auth.permission.public.methods=GET,HEAD,OPTIONS
quarkus.http.auth.permission.public.priority=1

quarkus.http.auth.permission.secured.paths=/tlnv-restservice/api/*
quarkus.http.auth.permission.secured.policy=authenticated
quarkus.http.auth.permission.secured.priority=2

此方式下公共资源会被直接放行,不会进入Keycloak策略执行器的检查流程。

内容的提问来源于stack exchange,提问作者caromag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:14:55