REST API權限集成設計
應用分爲兩大部分,前端html+後端Rest服務,前端html和後端Rest服務部署徹底分離。
目標:可訪問資源都處於權限控制之下(意味着經過瀏覽器地址欄的任意url都會被攔截),並提供跨域訪問支持。
***html
項目模塊
前端模塊:應用界面,經過rest接口與後臺交互。
後端模塊:UPM(用戶權限管理)模塊+數據服務(包含多種數據來源,好比本地DB、第三方服務等)統一做爲Rest封裝層。前端
應用模塊權限訪問交互流程
Token
- Client和Server交互的令牌,至關於客戶端和Server交互的惟一id,絕大部分(登陸時不須要)Client請求都會帶上此id,和SessionId相似,只是它沒必要受限於單個Web容器並可以自定義Token的過時時間、生成策略。
- 對於一個獨立用戶,Server和UPM共用相同的Token。
- Token包含tokenid+userid+其它輔助信息.
UPM
UPM提供對整個應用系統中關於資源和用戶角色關係的權限配置,而且對外提供認證和受權的接口。後端
Token Manager
維護Token生命週期,可配置Token的過時時間,Token Mananger維護一張hash表,k爲用戶id,v爲Token,每次用戶請求匹配token時自動檢查Token是否過時,若是過時,則返回過時的狀態碼。
Token指標:Token使用次數、Token過時時間
Token使用次數:若是客戶端請求次數大於了Token默認設定請求次數,則須要從新生成Token,但無需從新登陸。
Token過時時間:超過Token過時時間的請求將會觸發從新登陸。api
登陸權限交互流程
業務流:用戶登陸(login.html)訪問,輸入用戶名和密碼後訪問主頁(index.html)跨域
登陸權限交互流程:
瀏覽器
- 用戶訪問Client靜態資源login.html,填寫用戶名和密碼並執行登陸
- 用戶名和密碼被傳遞到UPM
- UPM執行認證(authentication),校驗用戶名和密碼
- 認證經過後執行受權(authorization),獲取和當前用戶關聯的全部可訪問的資源
- 若是上一步執行成功,UPM將請求TokenManager建立Token,若不經過則返回錯誤碼(受權、認證錯誤碼不一樣)
- UPM將token+受權數據返回給客戶端
- 客戶端收到token+受權數據展示index.html給用戶(index.html可能存在多個模塊,須要控制頁面展現)
備註:Client端須要處理從UPM端返回的數據,包含Token和狀態碼,若是狀態碼不是成功標識,依據具體的狀態碼轉向特定頁面,不然登陸成功,存儲Token(好比存儲到Cookie),並跳轉到首頁。url
登陸後資源訪問
業務流:假定用戶進入index.html存在一個rest資源連接,對應rest服務"/audience/report",用於請求最新的人羣報告,人羣報告展現頁面爲audience.html設計
備註:此時用戶已登陸,Client的Cookie中已存在Tokenrest
人羣報告權限交互流程:
htm
- 用戶點擊"人羣報告"連接(rest url=/audience/report)
- 客戶端發送請求(包含user+rest url+ token)給UPM
- 客戶端發送請求(rest url=/audience/report + token)發給Server
- Server匹配token,UPM受權rest url,若是token未過時而且匹配成功而且upm受權成功將調用實際業務處理流獲取數據,不然返回錯誤碼
- 將數據和Token信息返回給客戶端
- Client依據Server的數據渲染人羣報告頁面展示給用戶
先後端交互備註
- 前端的全部請求,除登入請求以外,其它全部請求都在header中附帶用戶id(userId)和令牌(tokenId)傳遞給服務端。
- 任何請求都必須帶令牌,若無令牌,直接rest url訪問目標資源,則返回登陸頁。