歡迎關注全是乾貨的技術公衆號:JavaEdgehtml
本文主要內容:java
- 如何實現用戶認證與受權?
- 實現的三種方案,所有是經過畫圖的方式講解.以及三種方案的對比
- 最後根據方案改造Gateway和擴展Feign
也可以使用粘性會話,即:對相同IP的請求,NGINX總 會轉發到相同的Tomcat實例,這樣就就無需圖中的Session Store了。不過這種方式有不少缺點:好比用戶斷網重連,刷新頁面,因爲IP變了,NGINX會轉發到其餘Tomcat實例,而其餘實例沒有Session,因而就認爲用戶未登陸。這讓用戶莫名其妙。git
粘性會話不是本章重點,若是感興趣能夠百度一下(用得愈來愈少了)github
這裏講的是解密Token直接拿到用戶信息;事實上要看項目的具體實現;有時候Token裏不必定帶有用戶信息;而是利用Token某個地方查詢,才能得到用戶信息。web
◆ OAuth2實現單點登陸SSO算法
◆ OAuth 2.0系列文章spring
安全性好
可是實現成本高,並且屢次token交換和認證,因此有性能開銷編程
登陸成功後,網關頒發token,以後用戶的每一個請求都會攜帶該token,網關對其解密是否合法,過時等,token中會攜帶用戶信息,因此網關還可解析token便可知道用戶是誰,好比解析出了id和name,就會將其加入請求的header中進行轉發,每一個服務就知道是啥子用戶啦!小程序
優勢是實現簡單,性能佳,可是一旦網關的登陸認證被攻破,就涼了安全
請求通過網關到認證受權中心去登陸,成功則頒發token,以後用戶請求都會攜帶該token,可是網關不對token作操做
這樣下降了網關的設計複雜度,網關再也不關注用戶是誰了(再也不解密解析token),只負責轉發
讓系統也避免了裸奔的尷尬
可是要想解密token,仍是須要密鑰,如今每一個微服務都要去作解密工做,意味着每一個服務都知道密鑰了.被泄露的風險隨之增大,須要防止這種狀況,能夠按期更新密鑰,想辦法不讓開發直接看到密鑰自己(可是通常吧,除非有內部腦殘人士纔會泄露密鑰,通常仍是很安全的)
實現並不複雜,下降了網關的複雜度,可是密鑰若是泄露了,就完了,這個能夠藉助後面的方法避免,先留坑
咱們使用的token其實就是JWT,what's that?
JWT全稱Json web token ,是一個開放標準(RFC 7519) ,用來在各方之間安全地傳輸信息。JWT可被驗證和信任,由於它是數字簽名的。
◆ Signature = Header指定的簽名算法
(Base64(header).Base64(payload), 祕鑰)
● 祕鑰: HS256("aaaa.bbbbb",祕鑰)
推薦閱讀
JWT操做工具類分享
一樣的方式爲內容中心添加JWT配置,再也不贅述,注意secret都保持一致
在用戶中心添加依賴
服務實現
Spring AOP
咱們固然使用優雅地AOP切面編程這種可插拔的方式
定義註解
具體代碼看github
與用戶中心相似,再也不贅述
使用feign時並無傳遞token,因此當作未認證處理
修改控制器,以後將編譯報錯的代碼都註釋掉
須要修改控制器,這很差,棄用
exchange()
ClientHttpRequestInterceptor
需求:用戶role須是管理員纔有權訪問
經過注入的屬性值判斷,對於API多的就不合時宜了!
固然你用過濾器,攔截器實現也是能夠的.
修改網關配置
◆ 登陸認證的四種方案
◆ AOP實現認證受權
◆ N種訪問控制模型
◆ Feign傳遞Token
◆ JWT
◆ RestTemplate傳遞Token