大家好,我是廣漂程序員DevinRock!
1. 需求分析
前陣子,和問答群里一個前端朋友,隨便嘮了嘮。期間他問了我一個問題,讓我印象深刻。
他問的是,限制同一賬號只能在一處設備上登錄,是如何實現的?并且,他還把這個功能稱為“單點登錄”。
我說這不叫“單點登錄
”,這是“單設備登錄
”。
于是,當時對此概念區分不清的他,和我在語言上開始了深度糾纏。
所以在后面我就想,這個功能問題有必要整理一下,分享給現在還不清楚兩者概念的朋友們。
?
2. 功能實現
先聊聊“單點登錄”和“單設備登錄”區別,再說說實現“單設備登錄”的步驟。
2.1?單點登錄和單設備登錄的區別
“單點登錄”和“單設備登錄”是兩個完全不同的概念。
單設備登錄
指:在某個給定的時間,同一用戶只能在一臺設備上進行登錄,如果在其他設備上嘗試登錄,先前的會話將被中斷或注銷。
單點登錄
(簡稱SSO)指:允許用戶使用一組憑據(如用戶名和密碼)登錄到一個系統,然后可以在多個相關系統中,無需重新登錄即可訪問受保護的資源。
關于“單點登錄”的實現,這里簡單說一下。一般有兩種方式:若后端處理,部署一個認證中心,這是標準做法;若前端處理,可以用LocalStorage做跨域緩存。
2.2?單設備登錄的實現
要實現單設備登錄,一般來說,有兩種方式:使用數據庫記錄登錄狀態 和?使用令牌驗證機制 。
使用令牌驗證機制
?的實現步驟如下:
??用戶登錄時生成token,將賬號作為key,token作為value,并設置過期時間存入redis中。
??當用戶訪問應用時,在攔截器中解析token,獲取賬號,然后用賬號去redis中獲取相應的value。
??如果獲取到的value的token與當前用戶攜帶的token一致,則允許訪問;如果不一致,則提示前端重復登錄,讓前端清除token,并跳轉到登錄頁面。
??當用戶在另一臺設備登錄時,其token也會存入redis中,這樣就刷新了token的值和redis的過期時間。
?
使用數據庫記錄登錄狀態
?的實現步驟如下:
??在用戶登錄時,記錄用戶的賬號信息、登錄設備的唯一標識符(如設備ID或IP地址)以及登錄時間等信息到數據庫中的一個登錄表。
??每次用戶的登錄請求都會查詢數據庫中的登錄表,檢查是否存在該用戶的登錄記錄。如果存在記錄,則比對登錄設備的標識符和當前設備的標識符是否相同。
??如果當前設備與登錄設備不匹配,拒絕登錄并提示用戶在其他設備上已登錄。若匹配,則更新登錄時間。
??當用戶主動退出登錄或超過一定時間沒有操作時,清除該用戶的登錄記錄。
?
結語
建立這個平臺的初衷:
- 打造一個專注于前端功能問題的問答平臺,讓大家高效搜索處理同樣問題。
- 通過不斷積累問題,一起練習邏輯思維,并順便學習相關知識點。
- 遇到有共鳴的問題,與眾多同行朋友們一起討論,一起沉淀成長。
- 為了給功能問題專欄添加樂趣,增設技術資訊、實用干貨兩個新專欄。
?
?