SpringSecurity3.X的remember-me

在SpringSecurity中配置remember-me時,遇到這樣的問題,remember-me沒有起做用,按照官方文檔的講解,只須要在<http>中增長<remember-me />配置,並在login.jsp中增長以下代碼便可:html

<input id="_spring_security_remember_me" name="_spring_security_remember_me" type="checkbox" value="true"/>

簡要說明一下SpringSecurity的登陸過程:java

UsernamePasswordAuthenticationFilter :得到用戶提交的用戶名和密碼信息  
-->UserDetailsService :由其封裝用戶對象  
-->AbstractUserDetailsAuthenticationProvider :轉由其進行密碼和權限驗證,驗證經過後封裝一個Authentication  
-->ProviderManager:會將Authentication封裝到SecurityContext中(默認狀況下,ProviderManager會在認證成功後清除掉Authentication的密碼信息,但會保留用戶名稱)  
-->AbstractRememberMeServices :判斷請求參數中是否包含_spring_security_remember_me參數,若是包含而且值爲(true,on,yes,1)中的任意一個,則將用戶名和密碼信息保存進cookie,不然不作處理  
-->AccessDecisionManager :由其決定是否放行  
  
以後在請求被保護的資源時,RememberMeAuthenticationFilter會先判斷是否Authentication已經失效,若是失效,則試圖從cookie中尋找,找到則從新封裝Authentication。

問題就出在ProviderManager中,其布爾屬性eraseCredentialsAfterAuthentication默認值爲true,若是爲true則會在username和password驗證成功後清除掉Authentication中的password信息,而AbstractRememberMeServices 保存cookie的條件則須要從Authentication中同時取得username和password,這就致使默認狀況下AbstractRememberMeServices永遠不會將username和password存儲到cookie中,因此,爲了保證username和password能夠被正確的存儲到cookie中,咱們須要修改eraseCredentialsAfterAuthentication的值爲false,好在修改這個屬性很方便,以下:spring

<authentication-manager erase-credentials="false">  
        <authentication-provider user-service-ref="userService">  
            <password-encoder hash="md5" />  
        </authentication-provider>  
</authentication-manager>

<remember-me  token-validity-seconds="123456789"/>
相關文章
相關標籤/搜索