簡體   English   中英

使用Spring Security滾動記住我的Cookie

[英]Rolling remember me cookies with Spring Security

我正在使用Spring的TokenBasedRememberMeServicesRememberMeAuthenticationFilter通過Base-64編碼的cookie來識別以前記住的用戶。 根據界面協定,僅在每次交互式登錄后才設置/更新cookie。 這意味着在每次成功的基於cookie的登錄后,cookie的TTL不會更新。

我現在正在尋找一種使用TokenBasedRememberMeServices的方法來延長每次成功登錄(交互式或非交互式)之后的時間。 我當時正在考慮向過濾器中添加AuthenticationSuccessHandler ,或者在同一類中重寫onSuccessfulAuthentication ,但是我很好奇,如果a)你們中的任何一個遇到相同的問題,並且b)為什么這不是RememberMeServices的內置選項。

PS:“滾動記住我的cookie”具有明顯的安全缺陷,因為一個cookie基本上可以使您永遠不知道密碼就永遠登錄,但是讓我們將此問題放在一邊。

我相信您已經完全回答了自己的問題。 處理它的正確方法是實現AuthenticationSuccessHandler 這是成功執行自定義邏輯的正確位置。 您還解釋了為什么很少遇到這種情況,同時又為什么沒有現成的解決方案。 我不能說我在網上狂野地看到了這種行為。

當我閱讀TokenBasedRememberMeServices的代碼以給出替代答案時,我發現了這一行:

 public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication successfulAuthentication) {
    int tokenLifetime = calculateLoginLifetime(request, successfulAuthentication);
    long expiryTime = System.currentTimeMillis();
    // SEC-949
    expiryTime += 1000L* (tokenLifetime < 0 ? TWO_WEEKS_S : tokenLifetime);

    String signatureValue = makeTokenSignature(expiryTime, username, password);

    setCookie(new String[] {username, Long.toString(expiryTime), signatureValue}, tokenLifetime, request, response);

如您所見,有一種機制可以通過將tokenLifetime設置為負值來延長每次用戶成功登錄時的cookie壽命。

如果看到SEC-949 ,它描述了功能:

我已經在TokenBasedRememberMeServices中添加了對此的支持。 它允許使用負值作為tokenValiditySeconds屬性。 如果該值為負,則令牌expiryTime(用於簽名)將默認保留14天,但是cookie maxAge將被設置為負值,以防止在瀏覽器關閉時將其保留在客戶端上。

PersistentTokenBasedRememberMeServices將在初始化時拒絕負值。

如果您想進行更多自定義,我想您需要擴展該類,或修改該類並將補丁發送給spring。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM