国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

擴(kuò)展資源服務(wù)器解決oauth2 性能瓶頸

DevYK / 1082人閱讀

摘要:用戶攜帶請(qǐng)求資源服務(wù)器資源服務(wù)器攔截器攜帶去認(rèn)證服務(wù)器調(diào)用對(duì)合法性校驗(yàn)資源服務(wù)器拿到,默認(rèn)只會(huì)含有用戶名信息通過用戶名調(diào)用查詢用戶全部信息詳細(xì)性能瓶頸分析,請(qǐng)參考上篇文章擴(kuò)展解決性能瓶頸本文是針對(duì)傳統(tǒng)使用的情況進(jìn)行擴(kuò)展,提高系統(tǒng)的吞吐率,解

用戶攜帶token 請(qǐng)求資源服務(wù)器

資源服務(wù)器攔截器 攜帶token 去認(rèn)證服務(wù)器 調(diào)用tokenstore 對(duì)token 合法性校驗(yàn)

資源服務(wù)器拿到token,默認(rèn)只會(huì)含有用戶名信息

通過用戶名調(diào)用userdetailsservice.loadbyusername 查詢用戶全部信息

詳細(xì)性能瓶頸分析,請(qǐng)參考上篇文章《擴(kuò)展jwt解決oauth2 性能瓶頸》
本文是針對(duì)傳統(tǒng)使用UUID token 的情況進(jìn)行擴(kuò)展,提高系統(tǒng)的吞吐率,解決性能瓶頸的問題

默認(rèn)check-token 解析邏輯

RemoteTokenServices 入口

@Override
public OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException {

    MultiValueMap formData = new LinkedMultiValueMap();
    formData.add(tokenName, accessToken);
    HttpHeaders headers = new HttpHeaders();
    headers.set("Authorization", getAuthorizationHeader(clientId, clientSecret));
    // 調(diào)用認(rèn)證服務(wù)器的check-token 接口檢查token
    Map map = postForMap(checkTokenEndpointUrl, formData, headers);

    return tokenConverter.extractAuthentication(map);
}

解析認(rèn)證服務(wù)器返回的信息

DefaultAccessTokenConverter

public OAuth2Authentication extractAuthentication(Map map) {
        Map parameters = new HashMap();
        Set scope = extractScope(map);
        // 主要是 用戶的信息的抽取
        Authentication user = userTokenConverter.extractAuthentication(map);
        // 一些oauth2 信息的填充
        OAuth2Request request = new OAuth2Request(parameters, clientId, authorities, true, scope, resourceIds, null, null,
                null);
        return new OAuth2Authentication(request, user);
    }

組裝當(dāng)前用戶信息

DefaultUserAuthenticationConverter

public Authentication extractAuthentication(Map map) {
    if (map.containsKey(USERNAME)) {
        Object principal = map.get(USERNAME);
        Collection authorities = getAuthorities(map);
        if (userDetailsService != null) {
            UserDetails user = userDetailsService.loadUserByUsername((String) map.get(USERNAME));
            authorities = user.getAuthorities();
            principal = user;
        }
        return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
    }
    return null;
}
問題分析

認(rèn)證服務(wù)器check-token 返回的全部信息

資源服務(wù)器在根據(jù)返回信息組裝用戶信息的時(shí)候,只是用了username

如果設(shè)置了 userDetailsService 的實(shí)現(xiàn)則去調(diào)用 loadUserByUsername 再去查詢一次用戶信息

造成問題現(xiàn)象

如果設(shè)置了userDetailsService 即可在spring security 上下文獲取用戶的全部信息,不設(shè)置則只能得到用戶名。

增加了一次查詢邏輯,對(duì)性能產(chǎn)生不必要的影響

解決問題

擴(kuò)展UserAuthenticationConverter 的解析過程,把認(rèn)證服務(wù)器返回的信息全部組裝到spring security的上下文對(duì)象中

/**
 * @author lengleng
 * @date 2019-03-07
 * 

* 根據(jù)checktoken 的結(jié)果轉(zhuǎn)化用戶信息 */ public class PigxUserAuthenticationConverter implements UserAuthenticationConverter { private static final String N_A = "N/A"; // map 是check-token 返回的全部信息 @Override public Authentication extractAuthentication(Map map) { if (map.containsKey(USERNAME)) { Collection authorities = getAuthorities(map); String username = (String) map.get(USERNAME); Integer id = (Integer) map.get(SecurityConstants.DETAILS_USER_ID); Integer deptId = (Integer) map.get(SecurityConstants.DETAILS_DEPT_ID); Integer tenantId = (Integer) map.get(SecurityConstants.DETAILS_TENANT_ID); PigxUser user = new PigxUser(id, deptId, tenantId, username, N_A, true , true, true, true, authorities); return new UsernamePasswordAuthenticationToken(user, N_A, authorities); } return null; } }

給remoteTokenServices 注入這個(gè)實(shí)現(xiàn)

public class PigxResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        DefaultAccessTokenConverter accessTokenConverter = new DefaultAccessTokenConverter();
        UserAuthenticationConverter userTokenConverter = new PigxUserAuthenticationConverter();
        accessTokenConverter.setUserTokenConverter(userTokenConverter);

        remoteTokenServices.setRestTemplate(lbRestTemplate);
        remoteTokenServices.setAccessTokenConverter(accessTokenConverter);
        resources.
                .tokenServices(remoteTokenServices);
    }
}

完成擴(kuò)展,再來看文章開頭的流程圖就變成了如下

關(guān)注我

個(gè)人項(xiàng)目 基于Spring Cloud、OAuth2.0開發(fā)基于Vue前后分離的開發(fā)平臺(tái)

QQ: 2270033969 一起來聊聊你們是咋用 spring cloud 的吧。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77465.html

相關(guān)文章

  • 擴(kuò)展資源務(wù)器解決oauth2 性能瓶頸

    摘要:用戶攜帶請(qǐng)求資源服務(wù)器資源服務(wù)器攔截器攜帶去認(rèn)證服務(wù)器調(diào)用對(duì)合法性校驗(yàn)資源服務(wù)器拿到,默認(rèn)只會(huì)含有用戶名信息通過用戶名調(diào)用查詢用戶全部信息詳細(xì)性能瓶頸分析,請(qǐng)參考上篇文章擴(kuò)展解決性能瓶頸本文是針對(duì)傳統(tǒng)使用的情況進(jìn)行擴(kuò)展,提高系統(tǒng)的吞吐率,解 showImg(https://segmentfault.com/img/remote/1460000018549849?w=519&h=402)...

    Rocture 評(píng)論0 收藏0
  • 服務(wù)網(wǎng)關(guān)方案調(diào)研

    摘要:綜述經(jīng)調(diào)研,使用解決方案的占多數(shù),已經(jīng)能滿足絕大多數(shù)公司需求。但除了一些超級(jí)公司外,比如阿里,京東,他們是自己擼的一套網(wǎng)關(guān)。 綜述 經(jīng)調(diào)研,使用Spring Cloud Zuul解決方案的占多數(shù),已經(jīng)能滿足絕大多數(shù)公司需求。但除了一些超級(jí)公司外,比如阿里,京東,他們是自己擼的一套網(wǎng)關(guān)。此外,點(diǎn)評(píng)直接采用的nginx負(fù)載均衡前置網(wǎng)關(guān),而沒用第七層網(wǎng)關(guān),原因據(jù)說是七層網(wǎng)關(guān)會(huì)影響性能,但由于...

    Y3G 評(píng)論0 收藏0
  • 如何在微服務(wù)架構(gòu)中對(duì)資源(前端頁面+后端接口)進(jìn)行權(quán)限控制

    如何對(duì)資源(前端頁面+后端接口)進(jìn)行權(quán)限控制 在微服務(wù)架構(gòu)中,請(qǐng)求的攔截在gateway中完成,而權(quán)限的查詢是在uaa中完成,在gateway和uaa集成部署的情況下實(shí)現(xiàn)較為簡(jiǎn)單,如果兩者分離實(shí)現(xiàn)起來就會(huì)比較麻煩,一種方案是在gateway的資源filter中內(nèi)部調(diào)用uaa的權(quán)限查詢模塊,該方案是可行的,但是存在兩個(gè)弊端: 響應(yīng)延時(shí):每個(gè)資源的請(qǐng)求都會(huì)附帶一次uaa內(nèi)部調(diào)用,加重uaa服務(wù)的負(fù)擔(dān)...

    Nosee 評(píng)論0 收藏0
  • SpringCloud打造微服務(wù)平臺(tái)--概覽

    摘要:授權(quán)框架使第三方應(yīng)用程序來獲取對(duì)服務(wù)的有限訪問機(jī)會(huì)。無論是通過編排資源所有者和服務(wù)之間的交互批準(zhǔn)的資源所有者,或通過允許第三方應(yīng)用程序來獲取自己的訪問權(quán)限。 SpringCloud打造微服務(wù)平臺(tái)--概覽 簡(jiǎn)述 SpringCloud是什么 Spring Boot和SpringCloud是什么關(guān)系 Spring Boot是Spring的一套快速WEB開發(fā)的腳手架,可建立獨(dú)立的Sprin...

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

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

0條評(píng)論

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