在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"/>