Feign调用进行token鉴权

一、项目场景:

这边使用 两个springboot应用,中间通过feign来进行远程调用(是的没错,架构就是这么奇葩)。然后在调用feign的时候,希望可以进行token鉴权。

二、解决办法:

请求进来时,通过拦截器,校验header的token,然后在业务中调用feignClient时,通过新加一个feign拦截器,拦截feign请求,把当前的header中的token添加到feign的请求头中去。实现token在链路中的传递。

三、具体实现:

新增 feign 拦截器配置
/**
 * Feign请求拦截器配置.
 *
 * @author linzp
 * @version 1.0.0
 * @date 2021/4/16 21:19
 */
@Configuration
public class FeignInterceptorConfig implements RequestInterceptor {
          
   

    public FeignInterceptorConfig() {
          
   }

    @Override
    public void apply(RequestTemplate template) {
          
   
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //设置token到请求头
        template.header(ConstantCommon.HEADER_TOKEN_KEY, request.getHeader(ConstantCommon.HEADER_TOKEN_KEY));
    }
}
然后在feignClient接口中,添加 == configuration = FeignInterceptorConfig.class==

注意有Bug!!!

注意!!!,这里会有个异常,获取到的request会是null。原因是hytrix隔离策略是thread,无法读到 threadLocal变量。

解决办法!!更改策略

在配置文件中新增如下配置,即可解决!

# 更换hystrix策略,解决无法传递threadLocal变量问题
hystrix:
    command:
        default:
            execution:
                isolation:
                    strategy: SEMAPHORE
经验分享 程序员 微信小程序 职场和发展