cookie+memcached实现单点登陆
10年的時候在iteye的第一篇文章記錄了一下當時怎么實現我們系統的單點登陸。不過那個時候文章寫的不好,思路也很浮躁,很難看懂,在csdn的第一篇技術博客打算重新溫顧一下當時實現單點登陸的思路。先來看看什么叫單點登陸
單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用于同一個用戶的登錄的機制。 --百度百科
為什么要實現單點登陸?
從10年新版改造后,我們把一些輔助功能垂直切分成單獨的應用,跑在不同的應用服務器集群中。實現單點登陸,以保證各個應用間共享登陸狀態和用戶信息。
使用cookie實現單點登陸會遇到哪些問題?
第一個問題是cookie的過期時間設置的問題,要實現單點登陸,有很多種方式,我們采用讓根域名下的所有的應用共享cookie信息,設置cookie的過期時間時,有兩種情況:一種是過期時間為一個小于等于零的數值,這樣,cookie的信息是保存在內存中的,瀏覽器關閉,cookie信息就失效了。但是如果瀏覽器一直不關閉,cookie信息會一直在內存中不失效,這將給用戶的賬戶安全帶來極大的隱患。另外一種是過期時間為一個正數,設置成正數時,cookie信息會保存在用戶的硬盤上,在cookie還未過期時,即使用戶關閉瀏覽器,只要重新打開瀏覽器訪問,cookie信息會被重新讀取,登陸狀態恢復。這樣,也會存在安全隱患。僅僅通過cookie來實現單點登陸,還是存在風險的!正數不好,零和負數也不好,那設置成啥值呢?又該用怎么樣的方式來解決呢?實際上我們使用cookie+memcached有兩種實現方式供參考。
1、模仿session的會話維護的方式,用戶關閉瀏覽器,或者會話時間一段時間內不活動,會話就斷開了。我們將cookie的過期時間設置為一個小于等于0的數值,這樣在用戶關閉瀏覽器時,會話就結束了。而將用戶信息保存到memcache中,如果用戶30分鐘不活動,memcached中的值自動過期,用戶的會話也就結束了。所以判斷用戶的會話信息是否有效時需要經過兩個邏輯,一個是判斷cookie信息是否有效,一個是看memcached中是否有用戶信息。兩個條件都符合用戶的會話才有效。但是這種用法會有一個問題:memcachd是緩存,在設置過期時間創建之后,一到了過期時間,不管用戶的cookie信息是否依然存在,用戶是否依然在活動,memcached的信息依然會刪除。這就導致了用戶活動一段時間之后又要重新登錄。所以用戶活動每次獲取登錄狀態時都要重新設置用戶信息到緩存中。這個就解決了我們上面說的cookie信息的風險的問題。
2、使用memcached只用來保存用戶信息,以免太過頻繁的通過接口取用戶數據,而為了解決cookie過期的問題,我們還需要將系統的時間long值保存在cookie的信息中。以此要記錄用戶最后一次活動的時間,再根據邏輯判斷用戶的活動時間是否超過了指定的時間段。這個很好理解,我把你這次活動的時間保存在cookie里面,當你下一次活動時,再把上次保存的時間取出來,加上我指定的會話過期的時長,比如20分鐘,是否在當前時間之前,如果是,那會話就過期了,需要重新登錄。這樣每次用戶活動是需要刷新的是cookie,而不是memcached信息了,這樣memcached的緩存時間可以自行設定。
第二個問題是cookie的安全問題。cookie始終是在用戶的瀏覽器保存的,是由客戶端來管理的,現在找個能修改cookie信息的工具非常容易,怎么來防止cookie信息被篡改以保證單點登陸的安全?我們采用了互聯網中最為普遍的驗證簽名的方式來進行的,將登陸的cookie信息使用一個MD5(私鑰+信息字符)的算法,這樣,我們的cookie信息如果被刪除了,會話斷開了。如果被篡改了,驗簽不通過,會話也斷開。
cookie+memcached方式實現單點登陸的整體流程(圖畫的弱爆了,不獻丑了)
以cookie控制過期的方式為例子,memcached控制過期的方式反三一下。用戶登錄時,生成COOKIE信息sso_login:memberId|time|Md5(info) 和設置緩存,用戶每進行一次請求,首先取出COOKIE,驗證簽名數據,取出COOKIE的生成時間與現在的時間進行對比,驗證是否過期;再次,若驗證通過則獲取緩存中的用戶信息并重新生成cookie,主要是刷新cookie的生成時間,若驗證不通過或者過期,則進入用戶登錄流程。關鍵點都在那個cookie的格式上了,cookie的格式為 cookie.name=sso_login,value=memberId|time|Md5(info)?
總結
以上是生活随笔為你收集整理的cookie+memcached实现单点登陆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奶奶在不知情况下损坏了国家电网录过口供对
- 下一篇: REST风格的原则