AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

SpringCloud微服務(wù)中如何實(shí)現(xiàn)多端認(rèn)證?

來源: 責(zé)編: 時間:2024-03-18 09:34:36 206觀看
導(dǎo)讀概述DailyMart是一個ToC的在線購物商城,目前僅支持通過瀏覽器訪問。在商城中的所有操作都需要用戶先登錄。為了實(shí)現(xiàn)這一需求,我們可以采用以下技術(shù)方案:用戶通過SpringCloud Gateway訪問CustomerService進(jìn)行登錄認(rèn)證。認(rèn)

概述

DailyMart是一個ToC的在線購物商城,目前僅支持通過瀏覽器訪問。在商城中的所有操作都需要用戶先登錄。為了實(shí)現(xiàn)這一需求,我們可以采用以下技術(shù)方案:05328資訊網(wǎng)——每日最新資訊28at.com

  1. 用戶通過SpringCloud Gateway訪問CustomerService進(jìn)行登錄認(rèn)證。認(rèn)證成功后,服務(wù)器返回一個JWT(JSON Web Token)。在接下來的操作中,用戶需要在請求頭中攜帶此Token。
  2. 在網(wǎng)關(guān)服務(wù)中,我們創(chuàng)建了一個名為ApiAuthenticatorFilter的過濾器。該過濾器用于驗(yàn)證請求頭中是否包含Token,并檢查Token的有效性。如果請求頭中沒有攜帶Token,或者Token失效,則不允許訪問后端接口。

詳細(xì)交互流程如下圖1所示:05328資訊網(wǎng)——每日最新資訊28at.com

圖1:PC認(rèn)證流程圖1:PC認(rèn)證流程05328資訊網(wǎng)——每日最新資訊28at.com

多端認(rèn)證需求

這種架構(gòu)在初期可以滿足業(yè)務(wù)的發(fā)展需求。然而,隨著業(yè)務(wù)的擴(kuò)展,我們需要考慮到現(xiàn)在大部分用戶使用手機(jī)進(jìn)行購物的情況。因此,DailyMart也需要支持手機(jī)端訪問。但與瀏覽器不同,手機(jī)端的認(rèn)證機(jī)制可能會有所不同。05328資訊網(wǎng)——每日最新資訊28at.com

例如,瀏覽器端的Token有效期通常設(shè)定為1小時,而手機(jī)端的Token有效期通常設(shè)置為7天或更長。此外,瀏覽器端的Token采用JWT這種去中心化的認(rèn)證機(jī)制,而手機(jī)端的Token采用中心化的認(rèn)證機(jī)制,需要調(diào)用手機(jī)端服務(wù)進(jìn)行登錄認(rèn)證。05328資訊網(wǎng)——每日最新資訊28at.com

同時,為了擴(kuò)展業(yè)務(wù),其他一些第三方應(yīng)用可能也需要調(diào)用DailyMart的后端服務(wù)來獲取數(shù)據(jù),對于第三方的應(yīng)用一般采用appId + appSecret的方式進(jìn)行認(rèn)證,同時需要對接口參數(shù)進(jìn)行簽名防止出現(xiàn)篡改和重放。(此方案在前文中有詳細(xì)說明,可以通過鏈接跳轉(zhuǎn)訪問查看。)05328資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在的問題是,如何在原有架構(gòu)的基礎(chǔ)上滿足這三種不同形式的認(rèn)證需求呢?05328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片05328資訊網(wǎng)——每日最新資訊28at.com

解決方案

要解決這個問題,最關(guān)鍵在于如何判斷請求的來源,是來自瀏覽器端的請求、手機(jī)端的請求還是第三方的請求?05328資訊網(wǎng)——每日最新資訊28at.com

我們可以通過請求路徑進(jìn)行區(qū)分,對于不同端的請求使用不同的路徑進(jìn)行標(biāo)識,可以做如下約定:05328資訊網(wǎng)——每日最新資訊28at.com

  • 手機(jī)端請求,需要在請求路徑上帶有/ph/
  • 瀏覽器請求,需要在請求路徑上帶有/pd/
  • 第三方請求,需要在路徑請求上帶有/pt/
  • ...

最終規(guī)定接口的完整請求路徑為:/服務(wù)名/api/來源標(biāo)識/接口路徑/,如:http://localhost:9090/customer-service/api/pd/customer/info05328資訊網(wǎng)——每日最新資訊28at.com

這樣在SpringCloud Gateway網(wǎng)關(guān)先獲取請求的路徑,再根據(jù)請求的路徑判斷請求來源,最后根據(jù)請求來源實(shí)現(xiàn)不同的認(rèn)證方案。05328資訊網(wǎng)——每日最新資訊28at.com

解決這個問題的關(guān)鍵在于如何判斷請求的來源,即是來自瀏覽器端、手機(jī)端還是第三方應(yīng)用?05328資訊網(wǎng)——每日最新資訊28at.com

我們可以通過請求路徑進(jìn)行區(qū)分,對于不同端的請求使用不同的路徑進(jìn)行標(biāo)識。例如:05328資訊網(wǎng)——每日最新資訊28at.com

  • 手機(jī)端請求,在請求路徑上帶有 /ph/
  • 瀏覽器端請求,在請求路徑上帶有 /pd/
  • 第三方請求,在請求路徑上帶有 /pt/
  • ...

最終,我們規(guī)定接口的完整請求路徑為:/服務(wù)名/api/來源標(biāo)識/接口路徑/,例如:http://localhost:9090/customer-service/api/pd/customer/info05328資訊網(wǎng)——每日最新資訊28at.com

這樣,在SpringCloud Gateway網(wǎng)關(guān)中,我們需要創(chuàng)建一個過濾器,首先獲取請求的路徑,然后根據(jù)請求的路徑判斷請求來源,最后根據(jù)請求來源實(shí)現(xiàn)不同的認(rèn)證方案。05328資訊網(wǎng)——每日最新資訊28at.com

代碼實(shí)現(xiàn)

有了解決方案,我們就很容易完成代碼實(shí)現(xiàn)了。05328資訊網(wǎng)——每日最新資訊28at.com

為了滿足多端認(rèn)證的需求,在網(wǎng)關(guān)服務(wù)中我們可以抽取一個公共的認(rèn)證接口ApiAuthenticator,具體的認(rèn)證邏輯由具體實(shí)現(xiàn)類實(shí)現(xiàn)。05328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片05328資訊網(wǎng)——每日最新資訊28at.com

在上面的類圖中,ProtectedApiAuthenticator用于實(shí)現(xiàn)第三方的認(rèn)證邏輯,DefaultApiAuthenticator用于實(shí)現(xiàn)瀏覽器端的認(rèn)證邏輯。05328資訊網(wǎng)——每日最新資訊28at.com

在網(wǎng)關(guān)過濾器ApiAuthenticatorFilter中,我們首先根據(jù)請求路徑獲取請求來源,然后根據(jù)請求來源找到對應(yīng)的實(shí)現(xiàn)類。05328資訊網(wǎng)——每日最新資訊28at.com

@Component@Slf4jpublic class ApiAuthenticatorFilter implements GlobalFilter, Ordered {        @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        URI uri = exchange.getRequest().getURI();        String rawPath = uri.getRawPath();        // 靜態(tài)接口直接過濾        if (handleExcludeUrl(rawPath)) {            return chain.filter(exchange);        }              // 獲取認(rèn)證邏輯        ApiAuthenticator apiAuthenticator = getApiAuthenticator(rawPath);        AuthenticatorResult authenticatorResult = apiAuthenticator.auth(exchange);                if (!authenticatorResult.isResult()) {            return Mono.error(new HttpServerErrorException(                    HttpStatus.METHOD_NOT_ALLOWED, authenticatorResult.getMessage()));        }                return chain.filter(exchange);            }                /**     * 確定認(rèn)證策略     * @param rawPath 請求路徑     */    private ApiAuthenticator getApiAuthenticator(String rawPath) {        String[] parts = rawPath.split("/");        if (parts.length >= 4) {            String parameter = parts[3];            return switch (parameter) {                case PROTECT_PATH -> new ProtectedApiAuthenticator();                case PRIVATE_PATH -> new PrivateApiAuthenticator();                case PUBLIC_PATH -> new PublicApiAuthenticator();                case DEFAULT_PATH -> new DefaultApiAuthenticator();                default -> throw new IllegalStateException("Unexpected value: " + parameter);            };        }        return new DefaultApiAuthenticator();    } }

以下是瀏覽器端的認(rèn)證邏輯,它會驗(yàn)證JWT token的有效性。如果token失效,則直接返回錯誤提示給用戶,引導(dǎo)其重新登錄。05328資訊網(wǎng)——每日最新資訊28at.com

@Component@Slf4jpublic class DefaultApiAuthenticator implements ApiAuthenticator {        @Override    public AuthenticatorResult auth(ServerWebExchange exchange) {        ServerHttpRequest request = exchange.getRequest();        HttpHeaders httpHeaders = request.getHeaders();                // 獲取JWT請求頭 Authorization        String token = httpHeaders.getFirst(HttpHeaders.AUTHORIZATION);                if (Objects.nonNull(token)) {            try {                String subjectFromJWT = JwtUtil.getSubjectFromJWT(token);                log.info("用戶請求token: {} , 身份Subject:{}", token, subjectFromJWT);                //重新設(shè)置請求頭                mutateNewHeader(exchange, subjectFromJWT);                return new AuthenticatorResult(true, "認(rèn)證通過");            } catch (ParseException | JOSEException e) {                log.error("token解析失敗");                return new AuthenticatorResult(false, "Token錯誤,請重新登錄!");            }                    }                return new AuthenticatorResult(false, "Token為空,請重新登錄!");    }}

小結(jié)

本文提出了一種靈活、可擴(kuò)展的方案,以滿足 DailyMart 在業(yè)務(wù)發(fā)展過程中的多端認(rèn)證需求。通過使用請求路徑區(qū)分不同端的請求來源,并在 SpringCloud Gateway 網(wǎng)關(guān)中實(shí)現(xiàn)相應(yīng)的過濾器進(jìn)行認(rèn)證,方案具有靈活性、可擴(kuò)展性和可維護(hù)性。05328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-76482-0.htmlSpringCloud微服務(wù)中如何實(shí)現(xiàn)多端認(rèn)證?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 終于明白為啥面試?yán)鲜怯腥藛?SubList 了,原來這玩意會 OOM!

下一篇: 寫了個簡單爬蟲,收集 Boss直聘自動駕駛崗位

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 分布式系統(tǒng)中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統(tǒng)的小伙伴們來說,一提起分布式系統(tǒng),就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統(tǒng)
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個函數(shù),它接受另一個函數(shù)或類作為參數(shù),并返回一個新的函數(shù)或類。它們通常用
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 得物寵物生意「狂飆」,發(fā)力“它經(jīng)濟(jì)”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內(nèi)的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項(xiàng)。通過上傳自家寵物的部位細(xì)節(jié),就能收獲擁有專業(yè)資質(zhì)認(rèn)證的得物鑒
  • 品牌洞察丨服務(wù)本地,美團(tuán)直播成效幾何?

    來源:17PR7月11日,美團(tuán)App首頁推薦位出現(xiàn)&ldquo;美團(tuán)直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團(tuán)旅行直播間、美團(tuán)買菜直播間等均已上線,同時
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報道稱,近期淘寶天貓集團(tuán)啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項(xiàng),目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 華為Mate 60系列用上可變靈動島:正式版體驗(yàn)將會更出色

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強(qiáng)性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機(jī),該機(jī)搭載了聯(lián)發(fā)科天璣9000+,配備獨(dú)顯芯片Pro+,帶來了同價位段最佳的游戲體驗(yàn),一經(jīng)上市便受到了諸多用
Top