亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

feign之間傳遞oauth2?token的問題及解決方案

 更新時間:2022年03月15日 15:06:34   作者:張占嶺  
這篇文章主要介紹了feign之間傳遞oauth2?token的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

feign之間傳遞oauth2 token問題

在微服務架構(gòu)里,服務與服務之間的調(diào)用一般用feign就可以實現(xiàn),它是一種可視化的rpc,并且集成了ribbon的負載均衡能力,所以很受歡迎。

授權(quán)服務

在授權(quán)服務里,用戶通過用戶名密碼,或者手機和驗證碼等方式登陸之后,在http頭里會有授權(quán)的標識,在客戶端調(diào)用時,需要添加當時有效的token才可以正常訪問被授權(quán)的頁面。

Content-Type:application/jsonAuthorization:Bearer d79c064c-8675-4047-a119-fac692e447e8

而在業(yè)務層里,服務與服務之間使用feign來實現(xiàn)調(diào)用,而授權(quán)的代碼我們可以通過攔截器實現(xiàn),在feign請求之前,把當前服務的token添加到目標服務的請求頭就可以了,一般是這樣實現(xiàn)的。

/**
?* 發(fā)送FeignClient設置Header信息.
?* http://www.itmuch.com/spring-cloud-sum/hystrix-threadlocal/
?* Hystrix傳播ThreadLocal對象
?*/
@Component
public class TokenFeignClientInterceptor implements RequestInterceptor {
? /**
? ?* token放在請求頭.
? ?*
? ?* @param requestTemplate 請求參數(shù)
? ?*/
? @Override
? public void apply(RequestTemplate requestTemplate) {
? ? RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
? ? if (requestAttributes != null) {
? ? ? HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
? ? ? String token = request.getHeader(TokenContext.KEY_OAUTH2_TOKEN);
? ? ? requestTemplate.header(TokenContext.KEY_OAUTH2_TOKEN,
? ? ? ? ? new String[] {token});
? ? }
? }
}

上面的攔截器代碼沒有什么問題,也很好理解,但事實上,當你的feign開啟了hystrix功能,如果開啟了,需要把hystrix的策略進行修改,默認是THREAD的,這個級別時ThreadLocal是空的,所以你的授權(quán)不能傳給feign的攔截器.

hystrix.command.default.execution.isolation.strategy: SEMAPHORE?

資源項目里獲取當前用戶

在另一個項目,需要其它獲取當前用戶,需要使用下面的代碼。

先配置一個授權(quán)的地址

security:
? oauth2:
? ? resource:
? ? ? id: user
? ? ? user-info-uri: http://${auth.host:localhost}:${auth.port:8002}/user # 這里是授權(quán)服務的地址,即auth-service
? ? ? prefer-token-info: false
auth:
? host: localhost ?#這個不可以用eureka里的服務名,只能使用docker-compose里的服務名
? port: 8002

下面的代碼用來獲取當前用戶

?Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
? ? String user = objectMapper.writeValueAsString(authentication.getPrincipal());

主要對feign的請求頭傳遞信息進行講解分享給大家,各位多注意下!

oauth2 feign報401的錯誤

報錯問題:

feign.FeignException: status 401 reading UserFeign#queryUser(Long,String,String,String,Integer,Integer,Integer)

解決方法

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
@Configuration
public class FeignOauth2RequestInterceptor implements RequestInterceptor {
    private final String AUTHORIZATION_HEADER = "Authorization";
    private final String BEARER_TOKEN_TYPE = "Bearer";
    @Override
    public void apply(RequestTemplate requestTemplate) {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null && authentication.getDetails() instanceof OAuth2AuthenticationDetails) {
            OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
            requestTemplate.header(AUTHORIZATION_HEADER, String.format("%s %s", BEARER_TOKEN_TYPE, details.getTokenValue()));
        }
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot在項目停止(服務停止/關(guān)閉退出)之后執(zhí)行的方法

    SpringBoot在項目停止(服務停止/關(guān)閉退出)之后執(zhí)行的方法

    這篇文章主要給大家介紹了SpringBoot在項目停止(服務停止/關(guān)閉退出)之后執(zhí)行的兩種方法,實現(xiàn)DisposableBean接口和使用@PreDestroy注解,文中有詳細的代碼講解,具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • 使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能

    使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能

    什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機制的Web 開發(fā)框架.下面通過本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實現(xiàn) RESTful API功能,需要的朋友參考下吧
    2018-01-01
  • 通過Java添加Word文本框過程詳解

    通過Java添加Word文本框過程詳解

    這篇文章主要介紹了通過Java添加Word文本框過程詳解,在Word中,文本框是指一種可移動、可調(diào)節(jié)大小的文字或圖形容器。我們可以向文本框中添加文字、圖片、表格等對象,下面,將通過Java編程來實現(xiàn)添加以上對象到Word文本框,需要的朋友可以參考下
    2019-07-07
  • java利用SMB讀取遠程文件的方法

    java利用SMB讀取遠程文件的方法

    這篇文章主要為大家詳細介紹了java利用SMB讀取遠程文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Nginx啟用壓縮及開啟gzip 壓縮的方法

    Nginx啟用壓縮及開啟gzip 壓縮的方法

    這篇文章主要介紹了Nginx啟用壓縮及開啟gzip 壓縮的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • java生成圖片驗證碼示例代碼

    java生成圖片驗證碼示例代碼

    這篇文章主要為大家詳細介紹了java生成圖片驗證碼示例代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring Boot定時任務單線程多線程實現(xiàn)代碼解析

    Spring Boot定時任務單線程多線程實現(xiàn)代碼解析

    這篇文章主要介紹了Spring Boot定時任務單線程多線程實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 解決Required request body is missing錯誤的問題

    解決Required request body is missing錯誤的問題

    這篇文章主要介紹了解決Required request body is missing錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • JavaEE中struts2實現(xiàn)文件上傳下載功能實例解析

    JavaEE中struts2實現(xiàn)文件上傳下載功能實例解析

    這篇文章主要為大家詳細介紹了JavaEE中struts2實現(xiàn)文件上傳下載功能實例,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Springboot的spring-boot-maven-plugin導入失敗的解決方案

    Springboot的spring-boot-maven-plugin導入失敗的解決方案

    這篇文章主要介紹了Springboot的spring-boot-maven-plugin導入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論