成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Cloud OAuth 微服務(wù)內(nèi)部Token傳遞的源碼實(shí)現(xiàn)解析

Michael_Ding / 2665人閱讀

摘要:源碼非常簡(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) {
    Collection fromHeader = 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

相關(guān)文章

  • 使用 OAuth 2 和 JWT 為服務(wù)提供安全保障

    摘要:作為目前最主流的微服務(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ō)你不懂...

    littleGrow 評(píng)論0 收藏0
  • 使用 OAuth 2 和 JWT 為服務(wù)提供安全保障

    摘要:作為目前最主流的微服務(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ō)你不懂...

    xzavier 評(píng)論0 收藏0
  • 基于oauth 2.0 實(shí)現(xiàn)第三方開(kāi)放平臺(tái)

    摘要:本文單純從簡(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登錄、微信支付、微博登錄...

    Simon 評(píng)論0 收藏0
  • 基于oauth 2.0 實(shí)現(xiàn)第三方開(kāi)放平臺(tái)

    摘要:本文單純從簡(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登錄、微信支付、微博登錄...

    xiaodao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<