搜尋

首頁  >  問答  >  主體

單一登入ticket在redis中儲存問題

用戶透過在單一登入伺服器登陸,登入成功後,單一登入伺服器分配給該用戶一個ticket。然後單一登入伺服器將該ticket做為key,使用者名稱做為value,儲存在redis中。透過判斷該key是否是有效的來判斷該使用者會話有效。
後續會有服務透過傳送一個ticket到單一登入伺服器來驗證該ticket是否有效,來判斷該使用者是否登入了。
但是這樣會有個問題,某個用戶肯能不停的登錄,這樣單點登錄伺服器每次都會將該ticket存儲在redis中,雖然該ticket有過期時間,但有可能在短時間內在redis中寫入大量的ticket。
不知這個有什麼好的解決方法嗎?

世界只因有你世界只因有你2760 天前954

全部回覆(5)我來回復

  • PHPz

    PHPz2017-04-24 16:02:16

    如果你說的是介面遭到惡性呼叫的話,就屬於DDOS防護方面的了,我的回答也就不適用了。
    其實你的問題只要做過這個功能的都會遇到,就是如果判斷用戶已經登錄,說使用cookie和session的肯定是沒具體做過,這裡涉及的是不同瀏覽器登錄的情況,cookie和session都是沒用的。
    我當時的做法是在redis中再維護一個關係:用戶名-->ticket,這樣就可以根據用戶名找到之前的ticket,也就可以判斷出用戶是否重複登入了。

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-04-24 16:02:16

    個人先答一下,登陸的時候增加驗證碼,增加機器登入的難度。這個算一種方法,不知到是否有其他方法?

    回覆
    0
  • 某草草

    某草草2017-04-24 16:02:16

    登入以後ticket在用戶端應該有記錄吧或走session或走cookie 那麼退出登入時服務端拿到ticket去清空即可或使用者重複登入時服務端也可拿到上一次的ticket 來決定是否銷毀再一種就是以用戶id為key value存ticket

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-24 16:02:16

    短時間內不停的登錄,如果是人工操作,大可放心 redis 還不至於撐不住。

    如果是 DDoS 攻擊,那應該在外側(路由器、防火牆、HTTP伺服器或你的應用程式)添加防護策略。

    在應用程式中,取決於你準備如何定義這樣的「異常登錄」行為,例如你可以比較短期(你可以自訂時間間隔)內的登錄,來源是否一致(例如用戶5秒內從地球上10個不同的地方登入),當出發異常登入行為判斷後,你可以根據應用的敏感程度,決定如何處置(封號?封IP?蒐集證據警報:-)

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-04-24 16:02:16

    已經登陸了,為啥你還要讓他再登陸呢,邏輯就有問題啊?

    回覆
    0
  • 取消回覆