本文信息
- 本文建立於2018/03/22
- 2018/10/30 文章改名爲
一個簡單的用戶登陸與訪問權限控制設計
前述
- 系統用戶分爲管理員用戶、普通用戶
- 管理員用戶有且惟一
- 系統初始狀態不存咋任何用戶,首次使用需建立用戶(admin)
前端界面顯示控制
用戶管理模塊
根據本地credentials判斷是否爲管理員用戶 => 顯示/不顯示用戶管理模塊前端
導航欄模塊
- 功能頁面顯示導航欄;welcome/login不顯示導航欄
- 動態控制導航欄的顯示與隱藏
前端本地控制(進入頁面前)-- 路由守衛
welcome/login頁面
- 是否本地存在credentials(包含token及用戶信息)(是否屬於已登陸狀態) => 跳轉至首頁/Next
- 發送請求至後端 => 後端確認是否首次使用系統(系統有/無任何用戶)=> welcome/login頁面
功能頁面
是否本地存在credentials(是否屬於已登陸狀態) => 進入功能頁面/跳轉至login數據庫
Admin頁面
- 是否本地存在credentials(是否屬於已登陸狀態) => Next/跳轉至login
- 本地credentials是否顯示用戶爲管理員類型 => 進入Admin頁面/跳轉至404頁面
前端向後端請求驗證(進入頁面後)-- http攔截器
請求發送處理
每一個heep請求在請求頭帶上本地credentials中的token後端
請求響應處理
- 返回401狀態碼 => 刪除本地credentials(若是有),跳轉至login
- 不然,不作特殊處理
後端登陸與鑑權
登陸邏輯
- 後端接收到前端發送的用戶信息
- 將前端發送的用戶信息(密碼需在後端作hash處理)與數據庫用戶信息比對
- 若匹配,Next。若不匹配,返回incorrect/權限到期
- 緩存是否存在用戶登陸code(若不存在則生成隨機code並存入緩存)
- 簽入token,將用戶信息(id,type等)、code寫入token的payload,並設定token有效期
- 返回用戶信息及token至前端
用戶身份通常鑑定
- token解碼失敗:包括無token、token過時、token的payload不包含須要的信息 => 返回401
- token解碼 => 獲得用戶信息(包括id、code等) => 對比code與緩存code是否一致 => Next/返回401
- 根據token獲得的用戶信息判斷是否爲管理員 => 鑑定成功/Next
- 非管理員檢測用戶是否已被刪除(用戶刪除只更改數據庫狀態而非數據庫刪除) => 返回401/鑑定成功
建立用戶鑑權
- 建立的是系統第一個用戶
後端接收到前端發送的建立的用戶信息 => 請求頭是否沒有攜帶token或是否建立的用戶類型爲管理員 => Next/返回401
判斷是否爲首次使用系統 => 建立用戶/返回401api
-
建立的不是系統第一個用戶跨域
- 後端接收到前端發送的建立的用戶信息 => 請求頭攜帶token => 判斷token自己是否過時 =>返回401/Next
- 解碼token => 解碼後拿到用戶信息 => 用戶是否爲管理員且與緩存token比對 => Next/返回401
- 建立用戶 => 建立用戶是否成功 => 返回success/Next
- 是否已存在同名用戶 => 返回已存在同名用戶提示/返回fail
修改用戶信息鑑權
- 用戶身份通常鑑定
- 若鑑定用戶爲管理員,鑑權成功;不然,Next
- 鑑定須要修改的用戶信息是否爲用戶本身 => Next/返回401
- 鑑定舊密碼是否正確 => 鑑權成功/返回舊密碼incorrect
刪除用戶鑑權
- 用戶身份通常鑑定
- 鑑定用戶爲管理員 => 鑑權成功/Next
Tips
- 修改用戶密碼/刪除用戶成功後,刪除對應用戶的緩存裏的登陸code
- why not cookie => 無狀態、防xss攻擊、api多端共用
- 如何跨域共享用戶登陸狀態
- 已經使用了jwt,爲什麼還需loggedin-code => tips1即爲緣由
- 包含第三方登陸的登陸模塊設計(OAuth協議)