Spring Cloud Alibaba 實戰(十一) - Spring Cloud認證受權

歡迎關注全是乾貨的技術公衆號:JavaEdgehtml

本文主要內容:java

  • 如何實現用戶認證與受權?
  • 實現的三種方案,所有是經過畫圖的方式講解.以及三種方案的對比
  • 最後根據方案改造Gateway和擴展Feign

0 相關源碼

1 有狀態 vs 無狀態

1.1 有狀態

也可以使用粘性會話,即:對相同IP的請求,NGINX總 會轉發到相同的Tomcat實例,這樣就就無需圖中的Session Store了。不過這種方式有不少缺點:好比用戶斷網重連,刷新頁面,因爲IP變了,NGINX會轉發到其餘Tomcat實例,而其餘實例沒有Session,因而就認爲用戶未登陸。這讓用戶莫名其妙。git

粘性會話不是本章重點,若是感興趣能夠百度一下(用得愈來愈少了)github

1.2 無狀態


這裏講的是解密Token直接拿到用戶信息;事實上要看項目的具體實現;有時候Token裏不必定帶有用戶信息;而是利用Token某個地方查詢,才能得到用戶信息。web

1.3 對比小結

2 微服務認證方案

2.1 「到處安全」

推薦閱讀

OAuth2實現單點登陸SSO算法

OAuth 2.0系列文章spring

表明實現

  • Spring Cloud Security : https://cloud. spring.io/spring-cloud-security/reference/html/
  • Jboss Keycloak : https://www.keycloak.org

示例代碼

優劣分析

安全性好
可是實現成本高,並且屢次token交換和認證,因此有性能開銷編程

2.2 外部無狀態,內部有狀態

  • 架構過於複雜,微服務和傳統架構混合雙搭

2.3 網關認證受權,內部裸奔


登陸成功後,網關頒發token,以後用戶的每一個請求都會攜帶該token,網關對其解密是否合法,過時等,token中會攜帶用戶信息,因此網關還可解析token便可知道用戶是誰,好比解析出了id和name,就會將其加入請求的header中進行轉發,每一個服務就知道是啥子用戶啦!小程序

優劣

優勢是實現簡單,性能佳,可是一旦網關的登陸認證被攻破,就涼了安全

2.4 「內部裸奔」改進方案


請求通過網關到認證受權中心去登陸,成功則頒發token,以後用戶請求都會攜帶該token,可是網關不對token作操做
這樣下降了網關的設計複雜度,網關再也不關注用戶是誰了(再也不解密解析token),只負責轉發
讓系統也避免了裸奔的尷尬
可是要想解密token,仍是須要密鑰,如今每一個微服務都要去作解密工做,意味着每一個服務都知道密鑰了.被泄露的風險隨之增大,須要防止這種狀況,能夠按期更新密鑰,想辦法不讓開發直接看到密鑰自己(可是通常吧,除非有內部腦殘人士纔會泄露密鑰,通常仍是很安全的)

優劣分析

實現並不複雜,下降了網關的複雜度,可是密鑰若是泄露了,就完了,這個能夠藉助後面的方法避免,先留坑

2.5 方案對比與選擇

3 訪問控制模型(受權)

  • Access Control List (ACL)
  • Role-based access control (RBAC 最流行)
  • Attribute- based access control (ABAC)
  • Rule-based access control
  • Time-based access control

咱們使用的token其實就是JWT,what's that?

4 JWT

4.1 定義

JWT全稱Json web token ,是一個開放標準(RFC 7519) ,用來在各方之間安全地傳輸信息。JWT可被驗證和信任,由於它是數字簽名的。

4.2 組成

4.3 公式

token算法

  • Token = Base64(Header).Base64(Payload).Base64(Signature)
    示例: aaaa.bbbbb.ccccc

簽名算法

◆ Signature = Header指定的簽名算法
(Base64(header).Base64(payload), 祕鑰)
● 祕鑰: HS256("aaaa.bbbbb",祕鑰)

  • 推薦閱讀
    JWT操做工具類分享

  • 爲用戶中心引入JWT
  • 引入工具類後生成的JWT,並新建JWT操做類,並簡單測試生成JWT
  • 寫配置
  • 一樣的方式爲內容中心添加JWT配置,再也不贅述,注意secret都保持一致

5 實現認證受權

實現小程序登陸

  • 小程序登陸流程,咱們java代碼須要作的就是實現圖中的4,5,6步驟
  • 用戶點擊登陸按鈕後,彈出以下,點擊容許,即表示贊成獲取我的信息
  • login
  • 在用戶中心新建 dto類



  • 小程序API工具包
    ◆WxJava : https://github.com/Wechat-Group/WxJava
  • 在用戶中心添加依賴


    服務實現

    6 AOP實現登陸狀態檢查

    實現方式

  • Servlet過濾器
  • filter攔截器
  • Spring AOP

咱們固然使用優雅地AOP切面編程這種可插拔的方式

6.1 用戶中心

  • 引入依賴
  • 定義註解

    具體代碼看github

    6.2 內容中心

    與用戶中心相似,再也不贅述
    使用feign時並無傳遞token,因此當作未認證處理

    6.2.1 Feign實現Token傳遞

    實現方式 @RequestHeader

  • 修改控制器,以後將編譯報錯的代碼都註釋掉

    須要修改控制器,這很差,棄用

    實現方式 RequestInterceptor

    實現方式 RestTemplate實現Token傳遞

    exchange()
    ClientHttpRequestInterceptor

    7 AOP實現用戶權限驗證 - 受權

  • 需求:用戶role須是管理員纔有權訪問

    7.1 實現方案 - 土方法

  • 經過注入的屬性值判斷,對於API多的就不合時宜了!

    固然你用過濾器,攔截器實現也是能夠的.

    7.2 優雅地用AOP實現

  • 定義註解
  • 控制器方法上添加註解


  • 修改網關配置

    總結

    ◆ 登陸認證的四種方案
    ◆ AOP實現認證受權
    ◆ N種訪問控制模型
    ◆ Feign傳遞Token
    ◆ JWT
    ◆ RestTemplate傳遞Token

參考

相關文章
相關標籤/搜索