在Spring Security OAuth2授权服务中传递自定义Header至/oauth2/token API
解决Spring OAuth2中从请求头传递user-id到JWT Access Token的问题
实现步骤
1. 获取请求头中的user-id
在新版Spring OAuth2授权服务中,可通过RequestContextHolder获取当前请求的HttpServletRequest,进而读取请求头里的user-id。
2. 修改JwtTokenCustomizer动态添加Claims
在你已有的配置类中,补充动态获取请求头并设置自定义Claim的逻辑:
@Configuration public class JwtTokenCustomizerConfig { @Bean public OAuth2TokenCustomizer<JwtEncodingContext> tokenCustomizer() { return (context) -> { if (OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType())) { // 获取当前请求对象 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 从请求头读取user-id String userId = request.getHeader("user-id"); // 非空校验,避免空值写入Token if (userId != null && !userId.isEmpty()) { context.getClaims().claims((claims) -> { claims.put("userId", userId); }); } } }; } }
3. 调用验证
客户端调用/oauth2/token接口时,在请求头中携带user-id: 目标值,生成的Access Token就会包含userId这个自定义Claim。
关键说明
RequestContextHolder是Spring提供的请求上下文工具类,可直接获取当前请求实例,替代旧版废弃的HeaderMapRequestWrapper。- 空值处理:添加非空判断能避免请求头缺失
user-id时的异常,也可根据业务需求添加默认值或抛出校验异常。 - 适配新版库:该方案适配Spring Authorization Server(新OAuth2授权服务库),替代旧版的
JwtAccessTokenConverter.enhance()逻辑。
内容的提问来源于stack exchange,提问作者deepti
相关产品推荐
相关产品推荐

