REST API權限集成設計#
應用分為兩大部分,前端html+后端Rest服務,前端html和后端Rest服務部署完全分離。
目標:可訪問資源都處於權限控制之下(意味着通過瀏覽器地址欄的任意url都會被攔截),並提供跨域訪問支持。
項目模塊#
前端模塊:應用界面,通過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過期時間的請求將會觸發重新登錄。
登錄權限交互流程##
業務流:用戶登錄(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),並跳轉到首頁。
登錄后資源訪問##
業務流:假定用戶進入index.html存在一個rest資源鏈接,對應rest服務"/audience/report",用於請求最新的人群報告,人群報告展示頁面為audience.html
備注:此時用戶已登錄,Client的Cookie中已存在Token
人群報告權限交互流程:
- 用戶點擊"人群報告"鏈接(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訪問目標資源,則返回登錄頁。