Spring Boot OAuth2资源服务器如何配置使用自定义认证请求头
解决方案
Spring OAuth2 资源服务器原生支持自定义令牌读取的请求头,无需通过额外过滤器复制请求头实现,仅需替换默认的 Bearer 令牌解析器即可。
具体修改步骤
- 实例化自定义的
ServerBearerTokenAuthenticationConverter,指定读取自定义请求头 - 将自定义转换器注入当前安全链的JWT配置中
修改后完整配置代码
@EnableWebFluxSecurity public class WebSecurityConfiguration { // ... @Bean @Order(1) public SecurityWebFilterChain iamAuthFilterChain(ServerHttpSecurity http) { ServerWebExchangeMatcher matcher = exchange -> { HttpHeaders headers = exchange.getRequest().getHeaders(); List<String> strings = headers.get(SurpriseHeaders.IDP_AUTH_TOKEN_HEADER_NAME); return strings != null && strings.size() > 0 ? MatchResult.match() : MatchResult.notMatch(); }; // 自定义令牌解析器,指定从New-Auth头读取Bearer令牌 ServerBearerTokenAuthenticationConverter tokenConverter = new ServerBearerTokenAuthenticationConverter(); // 替换为你自定义的请求头常量即可 tokenConverter.setBearerTokenHeaderName(SurpriseHeaders.IDP_AUTH_TOKEN_HEADER_NAME); // *可选配置*:如果你的New-Auth头直接存放令牌不需要Bearer前缀,可添加以下配置 // tokenConverter.setTokenSubstringPrefix(""); http .securityMatcher(matcher) .csrf().disable() .authorizeExchange() .pathMatchers(navigationService.getAuthFreeEndpoints()).permitAll() .anyExchange().authenticated() .and() .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt .jwkSetUri(getJwkUri()) // 注入自定义令牌解析器 .bearerTokenConverter(tokenConverter) ) ) .addFilterAt(new LoggingFilter("idpAuthFilterChain"), SecurityWebFiltersOrder.FIRST) .addFilterAfter(new IdpTokenExchangeFilter(authClientService), SecurityWebFiltersOrder.AUTHENTICATION) ; return http.build(); } }
方案优势
- 是Spring Security官方支持的标准实现,避免自定义过滤器带来的请求头污染、线程安全等潜在问题
- 配置仅作用于当前
iamAuthFilterChain安全链,不会影响其他使用Authorization头的遗留安全链路,满足多安全链隔离要求 - 支持灵活扩展,可自定义令牌前缀、是否允许请求参数传令牌等规则
内容的提问来源于stack exchange,提问作者Silk0vsky
相关产品推荐
相关产品推荐

