一、項目需求
1.1 如何限制用戶只能操作自己的數據?
在微服務項目中,由於用戶往往需要通過網關訪問多個微服務,如登錄需要訪問用戶微服務,商品瀏覽需要訪問商品微服務,下單需要訪問訂單微服務,支付需要訪問支付微服務。但如何防止用戶操作其他用戶的數據,這就需要在各個微服務中增加授權認證。每個服務都要認證用戶的身份,身份認證成功後,需要識別用戶的角色然後授權訪問對應的功能。
1.2 名詞解釋
1.2.1 身份認證
用戶身份認證即用戶去訪問系統資源時系統要求驗證用戶的身份信息,身份合法方可繼續訪問。常見的用戶身份認證表現形式有:用戶名密碼登錄、指紋打卡等方式。即校驗用戶賬號密碼是否正確。
1.2.2 用戶授權
用戶認證通過後去訪問系統的資源,系統會判斷用戶是否擁有訪問資源的權限,只允許訪問有權限的系統資源,沒有權限的資源將無法訪問,這個過程叫用戶授權
1.3 單點登錄SSO
1.3.1 概念
用戶訪問的項目中,若有多個微服務需要識別用戶登錄情況,如果用戶訪問每個微服務都要登錄一次就太麻煩了,爲了提高用戶的體驗,需要實現讓用戶在一個系統中登錄,其他任意受信任的系統都可以訪問,這個功能就叫單點登錄
單點登錄(Single Sign On) 就是爲了解決這個問題,它的定義是:
在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統
1.3.2 單點登錄和單一登錄的區別
單一登錄:指同一個賬號在同一時間內只能有一個會話存在,即賬號A在手機上登錄着,這時候在電腦上登錄這個賬號,就會讓手機上的賬號強制下線。
單設備登錄:指相同的設備中,同一個賬號只能有一個會話存在。常見的設備分爲:安卓手機、iOS手機、pc端以及web端。
解決方案:
常見的解決方案爲 設置 session,並設置過期時間。當用戶每次登陸時都會更新這個 session,每次用戶請求時都會檢查請求中攜帶的 session 是否正確,若不正確則返回錯誤,前端強制踢出。
二、單點登錄方案
2.1 設計模型
在分佈式系統中要實現單點登錄,通常將認證系統單獨抽取出來,並將用戶身份信息存儲在單獨的存儲介質中(如 Mysql、Redis)中,考慮性能,通常存儲在 Redis 中
2.2 特點
- 認證系統爲獨立的系統
- 其他系統通過 http 或其他協議與認證系統通信,完成用戶認證
- 用戶身份信息存儲在 Redis 集羣中
2.3 常用技術
- Apache Shiro
- CAS
- Spring security CAS
- OAuth 2.0