一、用戶認證
1.1 、 用戶認證分析
上面流程圖描述了用戶要操作的各個微服務,用戶查看個人信息需要訪問客戶微服務,下單需要訪問訂
單微服務,秒殺搶購商品需要訪問秒殺微服務。每個服務都需要認證用戶的身份,身份認證成功後,需
要識別用戶的角色然後授權訪問對應的功能。
1.1.1、 單點登錄
用戶訪問的項目中,至少有3個微服務需要識別用戶身份,如果用戶訪問每個微服務都登錄一次就太麻
煩了,爲了提高用戶的體驗,我們需要實現讓用戶在一個系統中登錄,其他任意受信任的系統都可以訪
問,這個功能就叫單點登錄。
單點登錄(Single Sign On),簡稱爲 SSO,是目前比較流行的企業業務整合的解決方案之一。 SSO的
定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
1.2、 認證解決方案
1.2.1、 單點登錄技術方案
Java 中有很多用戶認證的框架都可以實現單點登錄:
- 1、Apache Shiro.
- 2、CAS
- 3、Spring security
1.3、 Spring security Oauth2認證解決方案
本項目採用 Spring security + Oauth2+JWT完成用戶認證及用戶授權,Spring security 是一個強大的和
高度可定製的身份驗證和訪問控制框架,Spring security 框架集成了Oauth2協議,下圖是項目認證架
構圖:
1 、用戶請求認證服務完成認證。
2、認證服務下發用戶身份令牌,擁有身份令牌表示身份合法。
3、用戶攜帶令牌請求資源服務,請求資源服務必先經過網關。
4、網關校驗用戶身份令牌的合法,不合法表示用戶沒有登錄,如果合法則放行繼續訪問。
5、資源服務獲取令牌,根據令牌完成授權。
6、資源服務完成授權則響應資源信息。
三、資源服務授權
資源服務擁有要訪問的受保護資源,客戶端攜帶令牌訪問資源服務,如果令牌合法則可成功訪問資源服
務中的資源,如下圖:
上圖的業務流程如下 :
1、客戶端請求認證服務申請令牌
2、認證服務生成令牌認證服務採用非對稱加密算法,使用私鑰生成令牌。
3、客戶端攜帶令牌訪問資源服務客戶端在Http header 中添加: Authorization:Bearer令牌。
4、資源服務請求認證服務校驗令牌的有效性資源服務接收到令牌,使用公鑰校驗令牌的合法性。
5、令牌有效,資源服務向客戶端響應資源信息
四、 認證開發
4.1、 需求分析
功能流程圖如下:
執行流程:
1、用戶登錄,請求認證服務
2、認證服務認證通過,生成jwt令牌,將jwt令牌及相關信息寫入Redis,並且將身份令牌寫入cookie
3、用戶訪問資源頁面,帶着cookie到網關
4、網關從cookie獲取token,並查詢Redis校驗token,如果token不存在則拒絕訪問,否則放行
5、用戶退出,請求認證服務,清除redis中的token,並且刪除cookie中的token
使用 redis存儲用戶的身份令牌有以下作用:
1、實現用戶退出註銷功能,服務端清除令牌後,即使客戶端請求攜帶token也是無效的。
2、由於jwt令牌過長,不宜存儲在cookie中,所以將jwt令牌存儲在redis,由客戶端請求服務端獲取並在
客戶端存儲
4.3、 認證服務
4.3.1、 認證需求分析
認證服務需要實現的功能如下:
1、登錄接口
前端post提交賬號、密碼等,用戶身份校驗通過,生成令牌,並將令牌存儲到redis。 將令牌寫入
cookie。
2、退出接口 校驗當前用戶的身份爲合法並且爲已登錄狀態。 將令牌從redis刪除。 刪除cookie中的令
牌。
5.2、 網關全局過濾器
新建過濾器類 AuthorizeFilter,對請求進行過濾
業務邏輯:
1)判斷當前請求是否爲登錄請求,是的話,則放行
2) 判斷cookie中是否存在信息, 沒有的話,拒絕訪問
3)判斷redis中令牌是否存在,沒有的話,拒絕訪問