?? 上一篇文章中我們對(duì)SpringSecurity圖片驗(yàn)證碼屿笼。
??我們?cè)谠L問很多網(wǎng)站的時(shí)候,會(huì)看到很長(zhǎng)一段時(shí)間可以不用登錄翁巍,那這個(gè)功能其實(shí)就是記住我功能驴一,這篇文章將使用SpringSecurity做到記住我功能,并且告知大家其中的原理灶壶,讓大家即使不通過SpringSecurity也能夠自己實(shí)現(xiàn)記住我功能肝断。
1.原理
1.1UsernamePasswordAuthenticationFilter接受到認(rèn)證請(qǐng)求
當(dāng)認(rèn)證成功后,會(huì)調(diào)用一個(gè)叫做RemeberMeService的服務(wù)例朱,這個(gè)是SpringSecurity提供的服務(wù)孝情,它主要做兩件事情鱼蝉,生成一個(gè)Token洒嗤,然后分別寫入數(shù)據(jù)庫和Cookie中去,如下圖代碼所示:
1.2第二次服務(wù)請(qǐng)求
此時(shí)是有RememberMeAuthenticationFilter來處理該請(qǐng)求魁亦,F(xiàn)ilter會(huì)讀取Cookie中的Token渔隶,然后繼續(xù)由RemeberMeService的TokenRepository來查找數(shù)據(jù)庫中的相關(guān)信息,如果查詢到了洁奈,此時(shí)會(huì)調(diào)用UserDetailsService來獲取用戶信息间唉。RememberMeAuthenticationFilter所處的位置是在倒數(shù)第二個(gè)Filter的位置。只要前面的Filter過濾掉了利术,都會(huì)經(jīng)過它來判斷是否需要免密登錄呈野。
2.實(shí)戰(zhàn)
2.1增加記住我功能的時(shí)間
設(shè)置為1小時(shí)
2.2增加配置
添加一個(gè)存儲(chǔ)token的repository,設(shè)置token的失效時(shí)間
2.3添加repositoryBean
@Bean
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
tokenRepository.setCreateTableOnStartup(true);
return tokenRepository;
}
這個(gè)Bean會(huì)被2.2使用到印叁,而且還會(huì)在數(shù)據(jù)庫中生成persistent_logins表液肌,用于登錄成功后的信息記錄
2.4測(cè)試
第一次登錄成功后,數(shù)據(jù)表中會(huì)添加信息
此時(shí)我們重啟應(yīng)用迫横,直接訪問user伤柄,會(huì)看到不用輸入密碼也能得到結(jié)果
記住我功能Get了嗎~~