最近項目用戶登錄的要求有所提高,必須單實例登錄,要提供記住密碼功能,用戶登錄后會有交易所以必須盡可能提高安全性,所以設計了一下用戶登錄結構
IP:用戶IP,用於區分用戶登錄所在位置
User:用戶名(用戶名+Id的Hash串),用於識別用戶
Token:用戶口令(MD5離散隨機數),用於區分單實例登錄(每次登錄或刷新SessionCache都會更新)
Series:用戶序列(MD5離散隨機數),用於強制用戶登錄會話失效重新登錄(密碼發生變更時更新)
一、首先我們要確定兩個規則
1、每次登陸或刷新Session都要更新Token(確保同一時間只有一個會話登錄)
2、任何密碼變更都需要更新Series(確保之前登錄信息失效)
二、cookie中我們保存兩種信息(自行選擇如何加密)
不記住密碼
1、Name
2、Token
記住密碼
1、Name
2、Token
3、Series
三、獲取用戶客戶端IP來區分客戶位置
四、處理普通會話與記住密碼會話的邏輯
在這里是核心判斷的位置,我們從Cookie中拿到所需的內容,判斷一下Cache中是否有這些會話信息,如果沒有可以直接跳轉登錄頁,
如果有再進行以下判斷:
1、Name是否與Cache一致
2、IP是否與Cache一致(驗證當前為同一個實例訪問)
3、Token是否與Cache一致(驗證當前為同一個實例登錄)
4、Series是否與DB一致(驗證當前賬戶未更新過密碼)
結果:
2不一致(用戶訪問位置異常)
3不一致(用戶登錄異常)
異常登錄提示賬戶風險,可以引導用戶修改密碼
4不一致(更新過密碼)
可以引導用戶重新登錄
如果是記住密碼那Cache沒有就不能直接跳回登錄頁了,而是核實一下Cookie的內容自動登錄,登錄需要核實一下幾點:
1、Name是否與DB一致
2、Series是否與DB一致
3、酌情判斷常用IP記錄里是否有當前IP
如果通過作如下操作:
新建Session Cache
存入新Token等
五、我們將Session存到Cache中,大部分用戶信息在DB中
總體設計如下圖(圖太大了可以圖片另存為下載查看):
一點見解,IP部分不好控制還需要調優,如果有建議還望指導,謝謝