springcloud Hystrix微服务接口之间的oauth2统一认证token传递

本文介绍了在SpringCloud Hystrix启用时,如何处理微服务接口间的OAuth2统一认证token传递问题。当使用Feign调用接口时,由于Hystrix的默认策略导致RequestContextHolder无法获取header信息,引发401错误。解决方法包括:1) 忽略接口校验;2) 使用RequestInterceptor和调整Hystrix策略为SEMAPHORE;3) 自定义HystrixConcurrencyStrategy实现ThreadLocal策略,确保请求头信息的传递。通过自定义策略,可以实现在使用默认的THREAD策略下,仍能保证token的有效传递。
摘要由CSDN通过智能技术生成

在springcloud框架使用Feign搭建服务之间的接口时,启用熔断器Hystrix时,发现接口的auth统一认证生效,而导致接口调用401报错。

为了跑通接口,尝试了很多种不同的方法

 

一、接口校验忽略

客户端忽略认证需要调用的接口,接口不需要通过认证就不会报错了(可方法就失去认证的功能,或获取token用户的信息)

security.ignored=/service/deploy/**

 

二、不想忽略接口,继续尝试

需要传递在服务端对请求的header中补充Authorization属性值

springcloud Fegin框架提供了一个RequestInterceptor拦截器,对Feign发起的请求进行拦截

如代码所示,给Fegin发起的请求加上当前上下文RequestContextHolder的header信息,这样请求就有Authorization认证参数了。

(Feign也是一个HTTP协议发送请求,相当于一个封装好的HttpClient服务,会启动一个新的request请求接口,而并非类似网关那样把原request请求转发到接口,所以header的参数就丢失了。)

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;


@Configuration
public class FeignConfig implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest httpServletRequest =   getHttpServletRequest();
        if(httpServletRequest!=null){
            Map<String, String> headers = getHeaders(httpServletRequest);
            // 传递所有请求头,防止部分丢失
            //此处也可以只传递认证的header
            //requestTemplate.header("Authorization", request.getHeader("Authorization"));
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                template.header(entry.get
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值