<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringCloud微服務(wù)下權(quán)限解決方案

          共 2644字,需瀏覽 6分鐘

           ·

          2020-07-27 18:17

          ef031e6826aaebb9b96edd9741083ca6.webp

          作者:厚德載物

          cnblogs.com/zhenghongxin/p/10006697.html

          無狀態(tài)登錄原理

          1.1. 什么是有狀態(tài)?

          有狀態(tài)服務(wù),即服務(wù)端需要記錄每次會話的客戶端信息,從而識別客戶端身份,根據(jù)用戶身份進行請求的處理,典型的設(shè)計如 tomcat 中的 session。

          例如登錄:用戶登錄后,我們把登錄者的信息保存在服務(wù)端 session 中,并且給用戶一個 cookie 值,記錄對應(yīng)的 session。然后下次請求,用戶攜帶 cookie 值來,我們就能識別到對應(yīng) session,從而找到用戶的信息。

          缺點是什么?

          • 服務(wù)端保存大量數(shù)據(jù),增加服務(wù)端壓力

          • 服務(wù)端保存用戶狀態(tài),無法進行水平擴展

          • 客戶端請求依賴服務(wù)端,多次請求必須訪問同一臺服務(wù)器

          1.2. 什么是無狀態(tài)

          微服務(wù)集群中的每個服務(wù),對外提供的都是 Rest 風格的接口。而 Rest 風格的一個最重要的規(guī)范就是:服務(wù)的無狀態(tài)性,即:

          • 服務(wù)端不保存任何客戶端請求者信息

          • 客戶端的每次請求必須具備自描述信息,通過這些信息識別客戶端身份

          帶來的好處是什么呢?

          • 客戶端請求不依賴服務(wù)端的信息,任何多次請求不需要必須訪問到同一臺服務(wù)

          • 服務(wù)端的集群和狀態(tài)對客戶端透明

          • 服務(wù)端可以任意的遷移和伸縮

          • 減小服務(wù)端存儲壓力

          1.3. 如何實現(xiàn)無狀態(tài)

          無狀態(tài)登錄的流程:

          • 當客戶端第一次請求服務(wù)時,服務(wù)端對用戶進行信息認證(登錄)

          • 認證通過,將用戶信息進行加密形成 token,返回給客戶端,作為登錄憑證

          • 以后每次請求,客戶端都攜帶認證的 token

          • 服務(wù)端對 token 進行解密,判斷是否有效。

          流程圖:

          b7f9197c12a6d6ec8052ce276a2cc864.webp

          整個登錄過程中,最關(guān)鍵的點是什么?

          token 的安全性

          token 是識別客戶端身份的唯一標示,如果加密不夠嚴密,被人偽造那就完蛋了。

          采用何種方式加密才是安全可靠的呢?

          我們將采用JWT + RSA非對稱加密

          1.4.JWT

          1.4.1. 簡介

          JWT,全稱是 Json Web Token, 是 JSON 風格輕量級的授權(quán)和身份認證規(guī)范,可實現(xiàn)無狀態(tài)、分布式的 Web 應(yīng)用授權(quán);官網(wǎng):https://jwt.io

          GitHub 上 jwt 的 java 客戶端:https://github.com/jwtk/jjwt

          1.4.2. 數(shù)據(jù)格式

          JWT 包含三部分數(shù)據(jù):

          • Header:頭部,通常頭部有兩部分信息:

            我們會對頭部進行 base64 加密(可解密),得到第一部分數(shù)據(jù)

            • 聲明類型,這里是 JWT

            • 加密算法,自定義

          • Payload:載荷,就是有效數(shù)據(jù),一般包含下面信息:

            這部分也會采用 base64 加密,得到第二部分數(shù)據(jù)

            • 用戶身份信息(注意,這里因為采用 base64 加密,可解密,因此不要存放敏感信息)

            • 注冊聲明:如 token 的簽發(fā)時間,過期時間,簽發(fā)人等

          • Signature:簽名,是整個數(shù)據(jù)的認證信息。一般根據(jù)前兩步的數(shù)據(jù),再加上服務(wù)的的密鑰(secret)(不要泄漏,最好周期性更換),通過加密算法生成。用于驗證整個數(shù)據(jù)完整和可靠性

          生成的數(shù)據(jù)格式:

          0abb1d649ff1e6241fd5386543dc1f09.webp

          可以看到分為 3 段,每段就是上面的一部分數(shù)據(jù)

          1.4.3.JWT 交互流程

          流程圖:

          88a0bfcf96c3eba8381e2bade18aff8c.webp

          步驟翻譯:

          • 1、用戶登錄

          • 2、服務(wù)的認證,通過后根據(jù) secret 生成 token

          • 3、將生成的 token 返回給瀏覽器

          • 4、用戶每次請求攜帶 token

          • 5、服務(wù)端利用公鑰解讀 jwt 簽名,判斷簽名有效后,從 Payload 中獲取用戶信息

          • 6、處理請求,返回響應(yīng)結(jié)果

          因為 JWT 簽發(fā)的 token 中已經(jīng)包含了用戶的身份信息,并且每次請求都會攜帶,這樣服務(wù)的就無需保存用戶信息,甚至無需去數(shù)據(jù)庫查詢,完全符合了 Rest 的無狀態(tài)規(guī)范。

          1.4.4. 非對稱加密

          加密技術(shù)是對信息進行編碼和解碼的技術(shù),編碼是把原來可讀信息(又稱明文)譯成代碼形式(又稱密文),其逆過程就是解碼(解密),加密技術(shù)的要點是加密算法,加密算法可以分為三類:

          • 對稱加密,如 AES

            • 基本原理:將明文分成 N 個組,然后使用密鑰對各個組進行加密,形成各自的密文,最后把所有的分組密文進行合并,形成最終的密文。

            • 優(yōu)勢:算法公開、計算量小、加密速度快、加密效率高

            • 缺陷:雙方都使用同樣密鑰,安全性得不到保證

          • 非對稱加密,如 RSA

            • 基本原理:同時生成兩把密鑰:私鑰和公鑰,私鑰隱秘保存,公鑰可以下發(fā)給信任客戶端

            • 私鑰加密,持有私鑰或公鑰才可以解密

            • 公鑰加密,持有私鑰才可解密

            • 優(yōu)點:安全,難以破解

            • 缺點:算法比較耗時

          • 不可逆加密,如 MD5,SHA

            • 基本原理:加密過程中不需要使用密鑰,輸入明文后由系統(tǒng)直接經(jīng)過加密算法處理成密文,這種加密后的數(shù)據(jù)是無法被解密的,無法根據(jù)密文推算出明文。

          RSA 算法歷史:

          1977 年,三位數(shù)學家 Rivest、Shamir 和 Adleman 設(shè)計了一種算法,可以實現(xiàn)非對稱加密。這種算法用他們?nèi)齻€人的名字縮寫:RSA

          結(jié)合 Zuul 的鑒權(quán)流程

          我們逐步演進系統(tǒng)架構(gòu)設(shè)計。需要注意的是:secret 是簽名的關(guān)鍵,因此一定要保密,我們放到鑒權(quán)中心保存,其它任何服務(wù)中都不能獲取 secret。

          1.5.1. 沒有 RSA 加密時

          在微服務(wù)架構(gòu)中,我們可以把服務(wù)的鑒權(quán)操作放到網(wǎng)關(guān)中,將未通過鑒權(quán)的請求直接攔截,如圖:

          bad5c64f076cbae8ded94247bfe10395.webp

          • 1、用戶請求登錄

          • 2、Zuul 將請求轉(zhuǎn)發(fā)到授權(quán)中心,請求授權(quán)

          • 3、授權(quán)中心校驗完成,頒發(fā) JWT 憑證

          • 4、客戶端請求其它功能,攜帶 JWT

          • 5、Zuul 將 jwt 交給授權(quán)中心校驗,通過后放行

          • 6、用戶請求到達微服務(wù)

          • 7、微服務(wù)將 jwt 交給鑒權(quán)中心,鑒權(quán)同時解析用戶信息

          • 8、鑒權(quán)中心返回用戶數(shù)據(jù)給微服務(wù)

          • 9、微服務(wù)處理請求,返回響應(yīng)

          發(fā)現(xiàn)什么問題了?

          每次鑒權(quán)都需要訪問鑒權(quán)中心,系統(tǒng)間的網(wǎng)絡(luò)請求頻率過高,效率略差,鑒權(quán)中心的壓力較大。

          結(jié)合 RSA 的鑒權(quán)

          直接看圖:

          5582fa96e7f52c240a3d2683440ece90.webp

          • 我們首先利用 RSA 生成公鑰和私鑰。私鑰保存在授權(quán)中心,公鑰保存在 Zuul 和各個微服務(wù)

          • 用戶請求登錄

          • 授權(quán)中心校驗,通過后用私鑰對 JWT 進行簽名加密

          • 返回 jwt 給用戶

          • 用戶攜帶 JWT 訪問

          • Zuul 直接通過公鑰解密 JWT,進行驗證,驗證通過則放行

          • 請求到達微服務(wù),微服務(wù)直接用公鑰解析 JWT,獲取用戶信息,無需訪問授權(quán)中心



          好文章,我在看

          瀏覽 23
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼亚洲视频 | 波多野结衣一区二区三区 | 日韩中文字幕无码中字字幕 | 一二区无码 | 最近中文字幕免费MV第一季歌词十 |