如何通过Spring Feign Client传递认证Bearer Token
实现Feign调用传递Bearer Token的几种方法
方法1:手动在Feign方法中传递请求头
直接在Feign接口的方法参数里添加@RequestHeader注解,调用时从当前请求中获取Token传入:
修改你的Feign接口:
@FeignClient("employee") public interface EmployeeFeignClient { @RequestMapping( method= RequestMethod.GET, value="/employee/code/{code}", consumes="application/json" ) EmployeeResponseEntity getEmployeeByCode( @PathVariable("code") String code, @RequestHeader("Authorization") String authorizationHeader ); }
调用时从当前请求获取Token:
// 注入HttpServletRequest获取当前请求头 @Autowired private HttpServletRequest request; public void queryEmployee(String empCode) { String bearerToken = request.getHeader("Authorization"); employeeFeignClient.getEmployeeByCode(empCode, bearerToken); }
方法2:全局Feign拦截器自动传递
通过实现RequestInterceptor,自动从当前请求上下文提取Token并添加到Feign请求头中,无需修改每个Feign方法:
创建拦截器类:
import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class FeignAuthInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 从请求上下文获取当前请求 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); String authToken = request.getHeader("Authorization"); // 如果Token存在,添加到Feign请求头 if (authToken != null) { template.header("Authorization", authToken); } } } }
这个拦截器会被Spring自动识别,所有Feign调用都会自动带上当前请求的Authorization头。
注意事项
如果你的调用是在异步线程中执行,RequestContextHolder可能无法获取到请求上下文,此时需要手动传递请求属性,或者在异步方法中重新设置上下文。
内容的提问来源于stack exchange,提问作者Toji
相关产品推荐
相关产品推荐

