摘要:源碼非常簡(jiǎn)單談?wù)剬?shí)現(xiàn)的問(wèn)題當(dāng)請(qǐng)求上線文沒(méi)有如果調(diào)用會(huì)直接,這個(gè)肯定會(huì)報(bào)錯(cuò),因?yàn)樯舷挛氖∪绻O(shè)置線程隔離,這里也會(huì)報(bào)錯(cuò)。導(dǎo)致安全上下問(wèn)題傳遞不到子線程中。歡迎關(guān)注我們獲得更多的好玩實(shí)踐
背景分析
1.客戶端攜帶認(rèn)證中心發(fā)放的token,請(qǐng)求資源服務(wù)器A(Spring Security OAuth 發(fā)放Token 源碼解析)
2.客戶端攜帶令牌直接訪問(wèn)資源服務(wù)器,資源服務(wù)器通過(guò)對(duì)token 的校驗(yàn) ([Spring Cloud OAuth2 資源服務(wù)器CheckToken 源碼解析
](https://my.oschina.net/giegie...) 判斷用戶的合法性,并保存到上下文中
3.A服務(wù)接口接收到請(qǐng)求,需要通過(guò)Feign或者其他RPC框架調(diào)用B服務(wù)來(lái)組裝返回?cái)?shù)據(jù)
本文主要來(lái)探討第三部 A --> B ,token 自定維護(hù)的源碼實(shí)現(xiàn)
如何實(shí)現(xiàn)token 傳遞 配置OAuth2FeignRequestInterceptor 即可此類是Feign 的攔截器實(shí)現(xiàn)
@Bean @ConditionalOnProperty("security.oauth2.client.client-id") public RequestInterceptor oauth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails resource,) { return new OAuth2FeignRequestInterceptor(oAuth2ClientContext, resource); }源碼解析
獲取上下文中的token ,組裝到請(qǐng)求頭
public class OAuth2FeignRequestInterceptor implements RequestInterceptor { // 給請(qǐng)求增加 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; } }
再來(lái)看AccessTokenContextRelay, 上下文token 中轉(zhuǎn)器.非常簡(jiǎn)單從上下文獲取認(rèn)證信息得到把 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; } }
什么時(shí)候執(zhí)行中轉(zhuǎn),oauth2 資源服務(wù)器非常簡(jiǎn)單暴力,加了個(gè)攔截器給轉(zhuǎn)發(fā)。
源碼非常簡(jiǎn)單
談?wù)剆pring security oauth 實(shí)現(xiàn)的問(wèn)題當(dāng)請(qǐng)求上線文沒(méi)有Token,如果調(diào)用feign 會(huì)直接,這個(gè)OAuth2FeignRequestInterceptor 肯定會(huì)報(bào)錯(cuò),因?yàn)樯舷挛腸opy 失敗
如果設(shè)置線程隔離,這里也會(huì)報(bào)錯(cuò)。導(dǎo)致安全上下問(wèn)題傳遞不到子線程中。
強(qiáng)制使用攔截器去處理 token 轉(zhuǎn)發(fā)到這里上下文,使用的業(yè)務(wù)場(chǎng)景只有這里,影響性能高
這三個(gè)問(wèn)題,大家在使用的過(guò)程中一定會(huì)遇到
自定義OAuth2FeignRequestInterceptor通過(guò)外部條件是否執(zhí)行token中轉(zhuǎn)
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); } }
手動(dòng)調(diào)用accessTokenContextRelay的copy,當(dāng)然需要覆蓋原生oauth 客戶端的配置
總結(jié)以上源碼參考個(gè)人項(xiàng)目 基于Spring Cloud、OAuth2.0開(kāi)發(fā)基于Vue前后分離的開(kāi)發(fā)平臺(tái)
QQ: 2270033969 一起來(lái)聊聊你們是咋用 spring cloud 的吧。
歡迎關(guān)注我們獲得更多的好玩JavaEE 實(shí)踐
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74136.html
摘要:作為目前最主流的微服務(wù)框架,發(fā)展速度很快,成為了最全面的微服務(wù)解決方案。通過(guò)認(rèn)證后,轉(zhuǎn)發(fā)給內(nèi)部相應(yīng)的服務(wù)器。所有遠(yuǎn)程訪問(wèn)資源服務(wù)器相關(guān)的必須提供。 Part 1 - 理論相關(guān) 作者 freewolf 關(guān)鍵詞 微服務(wù)、Spring Cloud、OAuth 2.0、JWT、Spring Security、SSO、UAA 寫在前面 作為從業(yè)了十多年的IT行業(yè)和程序的老司機(jī),今天如果你說(shuō)你不懂...
摘要:作為目前最主流的微服務(wù)框架,發(fā)展速度很快,成為了最全面的微服務(wù)解決方案。通過(guò)認(rèn)證后,轉(zhuǎn)發(fā)給內(nèi)部相應(yīng)的服務(wù)器。所有遠(yuǎn)程訪問(wèn)資源服務(wù)器相關(guān)的必須提供。 Part 1 - 理論相關(guān) 作者 freewolf 關(guān)鍵詞 微服務(wù)、Spring Cloud、OAuth 2.0、JWT、Spring Security、SSO、UAA 寫在前面 作為從業(yè)了十多年的IT行業(yè)和程序的老司機(jī),今天如果你說(shuō)你不懂...
摘要:本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。它的特點(diǎn)就是通過(guò)客戶端的后臺(tái)服務(wù)器,與服務(wù)提供商的認(rèn)證服務(wù)器進(jìn)行互動(dòng)能夠滿足絕大多數(shù)開(kāi)放平臺(tái)認(rèn)證授權(quán)的需求。 本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。 什么是開(kāi)放平臺(tái) 通過(guò)開(kāi)放自己平臺(tái)產(chǎn)品服務(wù)的各種API接口,讓其他第三方開(kāi)發(fā)者在開(kāi)發(fā)應(yīng)用時(shí)根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...
摘要:本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。它的特點(diǎn)就是通過(guò)客戶端的后臺(tái)服務(wù)器,與服務(wù)提供商的認(rèn)證服務(wù)器進(jìn)行互動(dòng)能夠滿足絕大多數(shù)開(kāi)放平臺(tái)認(rèn)證授權(quán)的需求。 本文單純從簡(jiǎn)單的技術(shù)實(shí)現(xiàn)來(lái)講,不涉及開(kāi)放平臺(tái)的多維度的運(yùn)營(yíng)理念。 什么是開(kāi)放平臺(tái) 通過(guò)開(kāi)放自己平臺(tái)產(chǎn)品服務(wù)的各種API接口,讓其他第三方開(kāi)發(fā)者在開(kāi)發(fā)應(yīng)用時(shí)根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...
閱讀 3426·2021-11-24 09:38
閱讀 1409·2021-11-22 15:08
閱讀 1501·2021-09-29 09:35
閱讀 505·2021-09-02 15:11
閱讀 1328·2019-08-30 12:55
閱讀 414·2019-08-29 17:16
閱讀 518·2019-08-29 11:30
閱讀 446·2019-08-26 13:23