[英]Rolling remember me cookies with Spring Security
我正在使用Spring的TokenBasedRememberMeServices和RememberMeAuthenticationFilter
通過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.