一個簡單的用戶登陸與訪問權限控制設計

本文信息

  • 本文建立於2018/03/22
  • 2018/10/30 文章改名爲 一個簡單的用戶登陸與訪問權限控制設計

前述

  • 系統用戶分爲管理員用戶、普通用戶
  • 管理員用戶有且惟一
  • 系統初始狀態不存咋任何用戶,首次使用需建立用戶(admin)

前端界面顯示控制

用戶管理模塊

根據本地credentials判斷是否爲管理員用戶 => 顯示/不顯示用戶管理模塊前端

導航欄模塊

  • 功能頁面顯示導航欄;welcome/login不顯示導航欄
  • 動態控制導航欄的顯示與隱藏

前端本地控制(進入頁面前)-- 路由守衛

welcome/login頁面

  1. 是否本地存在credentials(包含token及用戶信息)(是否屬於已登陸狀態) => 跳轉至首頁/Next
  2. 發送請求至後端 => 後端確認是否首次使用系統(系統有/無任何用戶)=> welcome/login頁面

功能頁面

是否本地存在credentials(是否屬於已登陸狀態) => 進入功能頁面/跳轉至login數據庫

Admin頁面

  1. 是否本地存在credentials(是否屬於已登陸狀態) => Next/跳轉至login
  2. 本地credentials是否顯示用戶爲管理員類型 => 進入Admin頁面/跳轉至404頁面

前端向後端請求驗證(進入頁面後)-- http攔截器

請求發送處理

每一個heep請求在請求頭帶上本地credentials中的token後端

請求響應處理

  1. 返回401狀態碼 => 刪除本地credentials(若是有),跳轉至login
  2. 不然,不作特殊處理

後端登陸與鑑權

登陸邏輯

  1. 後端接收到前端發送的用戶信息
  2. 將前端發送的用戶信息(密碼需在後端作hash處理)與數據庫用戶信息比對
  3. 若匹配,Next。若不匹配,返回incorrect/權限到期
  4. 緩存是否存在用戶登陸code(若不存在則生成隨機code並存入緩存)
  5. 簽入token,將用戶信息(id,type等)、code寫入token的payload,並設定token有效期
  6. 返回用戶信息及token至前端

用戶身份通常鑑定

  1. token解碼失敗:包括無token、token過時、token的payload不包含須要的信息 => 返回401
  2. token解碼 => 獲得用戶信息(包括id、code等) => 對比code與緩存code是否一致 => Next/返回401
  3. 根據token獲得的用戶信息判斷是否爲管理員 => 鑑定成功/Next
  4. 非管理員檢測用戶是否已被刪除(用戶刪除只更改數據庫狀態而非數據庫刪除) => 返回401/鑑定成功

建立用戶鑑權

  1. 建立的是系統第一個用戶

後端接收到前端發送的建立的用戶信息 => 請求頭是否沒有攜帶token或是否建立的用戶類型爲管理員 => Next/返回401
判斷是否爲首次使用系統 => 建立用戶/返回401api

  1. 建立的不是系統第一個用戶跨域

    • 後端接收到前端發送的建立的用戶信息 => 請求頭攜帶token => 判斷token自己是否過時 =>返回401/Next
    • 解碼token => 解碼後拿到用戶信息 => 用戶是否爲管理員且與緩存token比對 => Next/返回401
    • 建立用戶 => 建立用戶是否成功 => 返回success/Next
    • 是否已存在同名用戶 => 返回已存在同名用戶提示/返回fail

修改用戶信息鑑權

  1. 用戶身份通常鑑定
  2. 若鑑定用戶爲管理員,鑑權成功;不然,Next
  3. 鑑定須要修改的用戶信息是否爲用戶本身 => Next/返回401
  4. 鑑定舊密碼是否正確 => 鑑權成功/返回舊密碼incorrect

刪除用戶鑑權

  1. 用戶身份通常鑑定
  2. 鑑定用戶爲管理員 => 鑑權成功/Next

Tips

  1. 修改用戶密碼/刪除用戶成功後,刪除對應用戶的緩存裏的登陸code
  2. why not cookie => 無狀態、防xss攻擊、api多端共用
  3. 如何跨域共享用戶登陸狀態
  4. 已經使用了jwt,爲什麼還需loggedin-code => tips1即爲緣由
  5. 包含第三方登陸的登陸模塊設計(OAuth協議)
相關文章
相關標籤/搜索