oauth2 微服务之间的认证 使用feign拦截器转发令牌


当我们做购物车时,出现一个需求,用户->网关->页面渲染服务->订单查询服务

网关给页面渲染服务时带着令牌(由网关直接写入request的header)

页面渲染服务需要调用订单查询服务里的查询购物车,通过feign的形式去调用,但是由于订单查询受oauth2保护,feign无法直接传递令牌,令牌到页面渲染后无法传递给订单查询

此时可以用feign的拦截器,拦截器应该定义在公共模块中,因为很多微服务都会使用这个拦截器

代码如下

package com.changgou.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

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

@Component
public class FeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        //传递令牌
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if(requestAttributes != null){
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            if(request != null){
                Enumeration<String> headerNames = request.getHeaderNames();
                while (headerNames.hasMoreElements()){
                    String headerName = headerNames.nextElement();
                    if("authorization".equals(headerName)){
                        String headerValues = request.getHeader(headerName);//得到的内容为 Bearer jwt令牌
                        //传递令牌
                        requestTemplate.header(headerName,headerValues);
                    }

                }
            }
        }

    }
}

使用这个拦截器,需要我们在拥有令牌的请求发起者处以bean的形式注入,比如这里就是在页面渲染服务中调用

此处我们在引导类中注入

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.changgou.order.feign")
public class WebOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebOrderApplication.class,args);
    }

    //feign拦截器,用于拦截feign,在微服务间转发令牌
    @Bean
    public FeignInterceptor feignInterceptor(){
        return  new FeignInterceptor(); }
}

1

1

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM