摘要:源碼非常簡單談談實現的問題當請求上線文沒有如果調用會直接,這個肯定會報錯,因為上下文失敗如果設置線程隔離,這里也會報錯。導致安全上下問題傳遞不到子線程中。歡迎關注我們獲得更多的好玩實踐
背景分析
1.客戶端攜帶認證中心發放的token,請求資源服務器A(Spring Security OAuth 發放Token 源碼解析)
2.客戶端攜帶令牌直接訪問資源服務器,資源服務器通過對token 的校驗 ([Spring Cloud OAuth2 資源服務器CheckToken 源碼解析
](https://my.oschina.net/giegie...) 判斷用戶的合法性,并保存到上下文中
3.A服務接口接收到請求,需要通過Feign或者其他RPC框架調用B服務來組裝返回數據
本文主要來探討第三部 A --> B ,token 自定維護的源碼實現
如何實現token 傳遞 配置OAuth2FeignRequestInterceptor 即可此類是Feign 的攔截器實現
@Bean @ConditionalOnProperty("security.oauth2.client.client-id") public RequestInterceptor oauth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails resource,) { return new OAuth2FeignRequestInterceptor(oAuth2ClientContext, resource); }源碼解析
獲取上下文中的token ,組裝到請求頭
public class OAuth2FeignRequestInterceptor implements RequestInterceptor { // 給請求增加 token @Override public void apply(RequestTemplate template) { template.header(header, extract(tokenType)); } protected String extract(String tokenType) { OAuth2AccessToken accessToken = getToken(); return String.format("%s %s", tokenType, accessToken.getValue()); } // 從spring security 上下文中獲取token public OAuth2AccessToken getToken() { OAuth2AccessToken accessToken = oAuth2ClientContext.getAccessToken(); if (accessToken == null || accessToken.isExpired()) { try { accessToken = acquireAccessToken(); } } return accessToken; } }
再來看AccessTokenContextRelay, 上下文token 中轉器.非常簡單從上下文獲取認證信息得到把 token 放到上下文
public class AccessTokenContextRelay { private OAuth2ClientContext context; public AccessTokenContextRelay(OAuth2ClientContext context) { this.context = context; } public boolean copyToken() { if (context.getAccessToken() == null) { Authentication authentication = SecurityContextHolder.getContext() .getAuthentication(); if (authentication != null) { Object details = authentication.getDetails(); if (details instanceof OAuth2AuthenticationDetails) { OAuth2AuthenticationDetails holder = (OAuth2AuthenticationDetails) details; String token = holder.getTokenValue(); DefaultOAuth2AccessToken accessToken = new DefaultOAuth2AccessToken( token); String tokenType = holder.getTokenType(); if (tokenType != null) { accessToken.setTokenType(tokenType); } context.setAccessToken(accessToken); return true; } } } return false; } }
什么時候執行中轉,oauth2 資源服務器非常簡單暴力,加了個攔截器給轉發。
源碼非常簡單
談談spring security oauth 實現的問題當請求上線文沒有Token,如果調用feign 會直接,這個OAuth2FeignRequestInterceptor 肯定會報錯,因為上下文copy 失敗
如果設置線程隔離,這里也會報錯。導致安全上下問題傳遞不到子線程中。
強制使用攔截器去處理 token 轉發到這里上下文,使用的業務場景只有這里,影響性能高
這三個問題,大家在使用的過程中一定會遇到
自定義OAuth2FeignRequestInterceptor通過外部條件是否執行token中轉
public void apply(RequestTemplate template) { CollectionfromHeader = template.headers().get(SecurityConstants.FROM); if (CollUtil.isNotEmpty(fromHeader) && fromHeader.contains(SecurityConstants.FROM_IN)) { return; } accessTokenContextRelay.copyToken(); if (oAuth2ClientContext != null && oAuth2ClientContext.getAccessToken() != null) { super.apply(template); } }
手動調用accessTokenContextRelay的copy,當然需要覆蓋原生oauth 客戶端的配置
總結以上源碼參考個人項目 基于Spring Cloud、OAuth2.0開發基于Vue前后分離的開發平臺
QQ: 2270033969 一起來聊聊你們是咋用 spring cloud 的吧。
歡迎關注我們獲得更多的好玩JavaEE 實踐
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74136.html
摘要:作為目前最主流的微服務框架,發展速度很快,成為了最全面的微服務解決方案。通過認證后,轉發給內部相應的服務器。所有遠程訪問資源服務器相關的必須提供。 Part 1 - 理論相關 作者 freewolf 關鍵詞 微服務、Spring Cloud、OAuth 2.0、JWT、Spring Security、SSO、UAA 寫在前面 作為從業了十多年的IT行業和程序的老司機,今天如果你說你不懂...
摘要:作為目前最主流的微服務框架,發展速度很快,成為了最全面的微服務解決方案。通過認證后,轉發給內部相應的服務器。所有遠程訪問資源服務器相關的必須提供。 Part 1 - 理論相關 作者 freewolf 關鍵詞 微服務、Spring Cloud、OAuth 2.0、JWT、Spring Security、SSO、UAA 寫在前面 作為從業了十多年的IT行業和程序的老司機,今天如果你說你不懂...
摘要:本文單純從簡單的技術實現來講,不涉及開放平臺的多維度的運營理念。它的特點就是通過客戶端的后臺服務器,與服務提供商的認證服務器進行互動能夠滿足絕大多數開放平臺認證授權的需求。 本文單純從簡單的技術實現來講,不涉及開放平臺的多維度的運營理念。 什么是開放平臺 通過開放自己平臺產品服務的各種API接口,讓其他第三方開發者在開發應用時根據需求直接調用,例如微信登錄、QQ登錄、微信支付、微博登錄...
摘要:本文單純從簡單的技術實現來講,不涉及開放平臺的多維度的運營理念。它的特點就是通過客戶端的后臺服務器,與服務提供商的認證服務器進行互動能夠滿足絕大多數開放平臺認證授權的需求。 本文單純從簡單的技術實現來講,不涉及開放平臺的多維度的運營理念。 什么是開放平臺 通過開放自己平臺產品服務的各種API接口,讓其他第三方開發者在開發應用時根據需求直接調用,例如微信登錄、QQ登錄、微信支付、微博登錄...
閱讀 3385·2021-11-24 09:38
閱讀 1385·2021-11-22 15:08
閱讀 1454·2021-09-29 09:35
閱讀 475·2021-09-02 15:11
閱讀 1304·2019-08-30 12:55
閱讀 384·2019-08-29 17:16
閱讀 492·2019-08-29 11:30
閱讀 415·2019-08-26 13:23