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

手动验证Keycloak access token及从控制器获取HttpFacade的方案咨询

解决方案

方式1:从控制器获取HttpFacade实例

你在控制器层可以直接通过请求响应对象构造HttpFacade,不需要额外注入:

  1. 在控制器方法参数中声明HttpServletRequest和HttpServletResponse,Spring会自动注入当前请求的实例
  2. 用Keycloak提供的SimpleHttpFacade构造实例即可直接传给BearerTokenRequestAuthenticator使用,示例代码:
import org.keycloak.adapters.springsecurity.facade.SimpleHttpFacade;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
public class YourController {
    @PostMapping("/your-endpoint")
    public void yourMethod(HttpServletRequest request, HttpServletResponse response) {
        SimpleHttpFacade httpFacade = new SimpleHttpFacade(request, response);
        // 把httpFacade传给BearerTokenRequestAuthenticator完成鉴权
    }
}

方式2:无需HttpFacade手动验证Access Token

Keycloak的Access Token本身是标准JWT格式,你可以直接按JWT校验逻辑手动完成鉴权,步骤如下:

  • 从请求头Authorization中提取token,去除Bearer 前缀得到原始token串
  • 提前获取对应Keycloak Realm的签名公钥,可在Realm设置页面复制或者程序启动时从Realm OpenID配置端点拉取后缓存
  • 使用JWT校验库(如JJWT、Nimbus JOSE+JWT)完成校验,必须校验的核心项:
    • 签名合法性:用之前获取的公钥验证token签名没有被篡改
    • 时效性:校验exp字段,确认token未过期
    • 签发方合法性:校验iss字段和你的Keycloak Realm地址一致
    • 受众合法性:校验aud字段包含你的服务客户端ID
  • 校验通过后可从token的payload中提取用户ID、角色、权限等自定义信息做后续业务校验

如果你的项目已经配置了Keycloak自动鉴权过滤器,还有更简单的方式:直接从安全上下文获取已校验的认证信息即可,不需要重复校验token:

import org.springframework.security.core.context.SecurityContextHolder;

// 直接调用即可,返回不为空且isAuthenticated()为true即代表token合法
var authentication = SecurityContextHolder.getContext().getAuthentication();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:04