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