用戶透過在單一登入伺服器登陸,登入成功後,單一登入伺服器分配給該用戶一個ticket。然後單一登入伺服器將該ticket做為key,使用者名稱做為value,儲存在redis中。透過判斷該key是否是有效的來判斷該使用者會話有效。
後續會有服務透過傳送一個ticket到單一登入伺服器來驗證該ticket是否有效,來判斷該使用者是否登入了。
但是這樣會有個問題,某個用戶肯能不停的登錄,這樣單點登錄伺服器每次都會將該ticket存儲在redis中,雖然該ticket有過期時間,但有可能在短時間內在redis中寫入大量的ticket。
不知這個有什麼好的解決方法嗎?
如果你說的是介面遭到惡性呼叫的話,就屬於DDOS防護方面的了,我的回答也就不適用了。
其實你的問題只要做過這個功能的都會遇到,就是如果判斷用戶已經登錄,說使用cookie和session的肯定是沒具體做過,這裡涉及的是不同瀏覽器登錄的情況,cookie和session都是沒用的。
我當時的做法是在redis中再維護一個關係:用戶名-->ticket,這樣就可以根據用戶名找到之前的ticket,也就可以判斷出用戶是否重複登入了。
個人先答一下,登陸的時候增加驗證碼,增加機器登入的難度。這個算一種方法,不知到是否有其他方法?
登入以後ticket在用戶端應該有記錄吧或走session或走cookie 那麼退出登入時服務端拿到ticket去清空即可或使用者重複登入時服務端也可拿到上一次的ticket 來決定是否銷毀再一種就是以用戶id為key value存ticket
短時間內不停的登錄,如果是人工操作,大可放心 redis 還不至於撐不住。
如果是 DDoS 攻擊,那應該在外側(路由器、防火牆、HTTP伺服器或你的應用程式)添加防護策略。
在應用程式中,取決於你準備如何定義這樣的「異常登錄」行為,例如你可以比較短期(你可以自訂時間間隔)內的登錄,來源是否一致(例如用戶5秒內從地球上10個不同的地方登入),當出發異常登入行為判斷後,你可以根據應用的敏感程度,決定如何處置(封號?封IP?蒐集證據警報:-)
已經登陸了,為啥你還要讓他再登陸呢,邏輯就有問題啊?