首页 > 其他 > 详细

oauth2 微服务之间的认证

时间:2021-01-18 22:23:25      阅读:22      评论:0      收藏:0      [点我收藏+]

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

网关给页面渲染服务时带着令牌(由网关直接写入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

 

oauth2 微服务之间的认证

原文:https://www.cnblogs.com/wrc-blog/p/14294925.html

(0)
(0)
   
举报
评论 一句话评论(0
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号