背景:
門戶網站分爲我的用戶,我的開發者,機構用戶,頁面不一樣的操做須要特定的用戶才能操做。如api申請,密鑰下載只有機構用戶纔可操做,重置密碼須要登陸後纔可操做。
管理端分爲系統管理員,開放平臺管理員,銀行管理員,不一樣的角色具備不一樣的權限,
權限按資源劃分
服務間調用也須要進行保護,如調用發送短信接口,調用發送站內信的接口,不能不加限制地對外暴露。
所以須要以接口爲粒度進行統一鑑權,在接口處註明須要的權限,需註明請求來源:門戶,管理端,服務間調用。若是是門戶或管理端,還可標註須要的角色或資源。可校驗多個來源。前端
技術設計:
對於門戶網站和管理端,用戶登陸成功後生成包含用戶信息(userId)的JWT token,前端保存在vuex中。每次操做請求將token放入front- Authorization和manage- Authorization以供服務端校驗。其中front和manage表明源自門戶和管理端。
服務間調用發送http請求時,在header處添加service- Authorization,值爲有效期爲30s的JWT token,service表明源自服務間調用。
經過註解標記須要校驗的接口,並添加所須要的請求來源和資源名稱,若是匹配則放行,不然報無權限請求。
利用攔截器對請求進行切面操做,若是該方法加@AuthRequest註解則尋找header,若包含front- Authorization,manage- Authorization或service- Authorization,則對該token進行JWT校驗。其中front和service校驗較爲簡單,直接校驗即刻,manage校驗token成功後還需從token中獲取userId,經過服務間調用判斷該用戶是否擁有該資源。若是門戶和管理端校驗成功,從token中取出userId,role放入attribute,供接口使用。
引入該包還爲feign調用添加service- Authorization的headervue
流程圖:web
說明:
門戶網站,管理端和服務間調用一般經過gateway,可是統一校驗不在gateway,而在各自服務,緣由以下:redis
權限是一種安全策略,用戶只可訪問被受權的資源。所以須要採起策略控制用戶的行爲。
涉及到如下幾個方面:vuex
權限功能在服務從單體轉向微服務架構面臨以下挑戰:後端
微服務應用的權限功能應具備特色:api
現有的解決方案:安全
通過比較,決定自行研發一套權限校驗框架,包括:cookie
架構圖:session
Token設計
一段字符串,用戶登錄成功後服務端生成返回至客戶端保存,做爲後續已登錄狀態的憑證。
優勢:
應具備如下特色:
過時策略:
Token過時後應進行續簽,而不是跳轉到登錄畫面,形成糟糕的用戶體驗。Token失效時間過長會存在安全性隱患,太短會形成頻繁的refresh token。好的體驗應該是在用戶無感知的狀況下進行token刷新。
什麼時候refresh token: