SpringCloud服務認證(JWT)

2021-09-24 21:53:49 字數 1826 閱讀 3399

在微服務架構下的服務基本都是無狀態的,傳統的使用session的方式不再適用。例如常用的鑑權框架spring security oauth2和用jwt來進行保護,相對於框架而言,jwt較輕,且可以自包含一些使用者資訊和設定過期時間,省去了spring security oauth2繁瑣的步驟。

jwt(json web token)是一種用來在網路上宣告某種身份的令牌(token),它的特點是緊湊且自包含並且基於json,通過一些常用的演算法對包含的主體資訊進行加密,安全性很高。它通常有三個部分組成:頭資訊(header),訊息體(payload),簽名(signature)。

header通常用來宣告令牌的型別和使用的演算法,payload主要用來包含使用者的一些資訊,signature部分則是將base64編碼後的header和payload進行簽名。

在微服務架構下,通常有單獨乙個服務auth去管理相關認證,為了安全不會直接讓使用者訪問某個服務,會開放乙個入口服務作為閘道器gateway,只允許外網閘道器,所有請求首先訪問gateway,有gateway將請求路由到各個服務,spring cloud下通常使用zuul來實現閘道器,整個基本過程如下圖所示:

客戶端請求閘道器後,閘道器會根據路徑過濾請求,是登入獲取token操作的路徑則直接放行,請求直接到達auth服務進行登入操作,之後進行jwt私鑰加密生成token返回給客戶端;是其他請求將會進行token私鑰解密校驗,如果token被篡改或者失效則直接拒絕訪問並返回錯誤資訊,如果驗證成功經過路由到達請求服務,請求服務響應並返回資料。

登入比較簡單,在驗證身份資訊後可以使用工具包例如jjwt根據使用者資訊生成token並設定有效時長,最後將token返回給客戶端儲存即可,客戶端只需要每次訪問時將token加在請求頭里即可,然後在zuul增加乙個filter,此filter來過濾請求,如果是登入獲取token則放行,其他的話用公鑰解密驗證token是否有效。

如果要實現重新整理,則需要在生成token時生成乙個refreshkey,在登入時和token一併返回給客戶端,然後由客戶端儲存定時使用refreshkey和token來重新整理獲取新的有效時長的token,這個refreshkey可自定義生成,為了安全起見,伺服器可能需要快取refreshkey,可使用redis來進行儲存,每次重新整理token都將生成新的refreshkey和token,伺服器需要將老refreshkey替換,客戶端儲存新的token和refreshkey來進行之後的訪問和重新整理。

如果要實現登出,並使得舊的token即便在有效期內也不能通過驗證,則需要修改登入、重新整理、和優化zuul的filter。首先在登入時生成token和refreshkey後,需要將token也進行快取,如果通過redis進行快取可以直接放乙個set下,此set儲存所有未過期的token。其次,在重新整理時在這個set中刪除舊的token並放入新的。最後對zuulfilter進行優化,在解密時先從redis裡存放token的set查詢此token是否存在(redis的set有提供方法),如果沒有則直接拒絕,如果有再進行下一步解密驗證有效時長,驗證有效時長是為了防止重新整理機制失效、沒有重新整理機制、網路異常強行退出等事件出現,在這種情況下舊的token沒有被刪除,導致了舊的token一直可以訪問(如果只驗證是否token是否在快取中)。在登出時只需要刪除redis中set的token記錄就好,最後寫個定時器去定時刪除redis中set裡面過時的token,原因也是重新整理機制失效、沒有重新整理機制、網路異常強行退出等事件出現導致舊的token沒有被刪除。

jwt第一次生成token 的時候會比較慢,而且因為採用了加密演算法保證安全,所以比較耗cpu,在高併發的情況下需要考慮cpu占用問題。還有乙個問題,jwt生成的token比較長,可能需要考慮流量問題。

**:

SpringCloud服務調服務

org.springframework.cloud spring cloud starter feign enablefeignclients configuration public class mybatisplusconfig 資料許可權外掛程式 return datascopeinterce...

springcloud 服務降級

降級就是將一些不常用的服務停掉從而釋放更多的資源來 一些主要的服務使用 1.服務降級中有很多的方法,最好的方式就是利用 docker 來實現,當 需要對某個服務進行降級時可以直接將這個服務的容器停掉,等到需要使用時在把這個服務重啟就行。2.通過api閘道器的方式進行降級這樣我們的就可以將前台的一切請...

springcloud服務建立

一,建立server 1,匯入依賴 2,編寫配置檔案 服務名稱 spring name qf spring cloud server server port 8761 eureka instance hostname localhost client 這個false為不向註冊中心註冊自己,在非集群的...