- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringSecurity如何實(shí)現兩周內自動(dòng)登錄記住我功能
這篇文章主要介紹SpringSecurity如何實(shí)現兩周內自動(dòng)登錄記住我功能,文中介紹的非常詳細,具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
一、最簡(jiǎn)實(shí)踐
其實(shí)實(shí)現這個(gè)功能非常簡(jiǎn)單,只需要我們在重寫(xiě)WebSecurityConfigurerAdapter 方法配置HttpSecurity 的時(shí)候增加rememberMe()方法。(下面代碼中省略了大量的關(guān)于Spring Security登錄驗證的配置,在本號此前的文章中已經(jīng)講過(guò))
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.rememberMe(); //實(shí)現記住我自動(dòng)登錄配置,核心的代碼只有這一行 }}
然后在登錄表單中加入一個(gè)checkbox勾選框,name屬性的值目前必須是“remember-me”(個(gè)性化更改的方法后面會(huì )講)。
<label><input type="checkbox" name="remember-me"/>自動(dòng)登錄</label>
就是這么簡(jiǎn)單,我們就實(shí)現了記住我功能,默認效果是:2周內免登錄。
二、實(shí)現原理
很多朋友可能看了上面的實(shí)現過(guò)程心里都犯懵,這樣就實(shí)現了?下面和大家說(shuō)明一下這過(guò)程中間,都做了哪些事情。
當我們登陸的時(shí)候,除了用戶(hù)名、密碼,我們還可以勾選remember-me。 如果我們勾選了remember-me,當我們登錄成功之后服務(wù)端會(huì )生成一個(gè)Cookie返回給瀏覽器,這個(gè)Cookie的名字默認是remember-me;值是一個(gè)token令牌。 當我們在有效期內再次訪(fǎng)問(wèn)應用時(shí),經(jīng)過(guò)RememberMeAuthenticationFilter,讀取Cookie中的token進(jìn)行驗證。驗正通過(guò)不需要再次登錄就可以進(jìn)行應用訪(fǎng)問(wèn)。
這個(gè)token令牌是一個(gè) MD5 hash字符串:包含username、expirationTime和passwod和一個(gè)預定義的key,并將他們經(jīng)過(guò)MD5加密??赡苡械呐笥褧?huì )問(wèn):這樣安全么?如果cookie被劫持,一定是不安全的,別人拿到了這個(gè)字符串在有效期內就可以訪(fǎng)問(wèn)你的應用。這就和你的鑰匙token被盜了,你家肯定不安全是一個(gè)道理。 但是不存在密碼被破解為明文的可能性,MD5 hash是不可逆的。
RememberMeAuthenticationFilter在Spring Security過(guò)濾器鏈中處于整體偏后的位置,所以只有當各種傳統的登錄方式都無(wú)法完成驗證的情況下,才走RememberMeAuthenticationFilter,這也是符合實(shí)際需求的。
三、個(gè)性化配置
在實(shí)際的開(kāi)發(fā)過(guò)程中,我們還可以根據需求做一些個(gè)性化的設置,如下:
.rememberMe() .rememberMeParameter("remember-me-new") .rememberMeCookieName("remember-me-cookie") .tokenValiditySeconds(2 * 24 * 60 * 60);
tokenValiditySeconds用于設置token的有效期,即多長(cháng)時(shí)間內可以免除重復登錄,單位是秒。不修改配置情況下默認是2周。
通過(guò)rememberMeParameter設置from表單“自動(dòng)登錄”勾選框的參數名稱(chēng)。如果這里改了,from表單中checkbox的name屬性要對應的更改。如果不設置默認是remember-me。
rememberMeCookieName設置了保存在瀏覽器端的cookie的名稱(chēng),如果不設置默認也是remember-me。如下圖中查看瀏覽器的cookie。
上面我們講的方式,就是最簡(jiǎn)單的實(shí)現“記住我-自動(dòng)登錄”功能的方式。這種方式的缺點(diǎn)在于:token與用戶(hù)的對應關(guān)系是在內存中存儲的,當我們重啟應用之后所有的token都將消失,即:所有的用戶(hù)必須重新登陸。為此,Spring Security還給我們提供了一種將token存儲到數據庫中的方式,重啟應用也不受影響。
有的文章說(shuō)使用數據庫存儲方式是因為這種方式更安全,筆者不這么認為。雖然數據庫存儲的token的確不再是用戶(hù)名、密碼MD5加密字符串了,而是一個(gè)隨機序列號。但是一旦你的隨機序列號cookie被劫持,效果是一樣的。好比你家有把密碼鎖:你把鑰匙丟了和你把密碼丟了,危害性是一樣的。
上圖是token數據庫存儲方式的實(shí)現原理和驗證過(guò)程,下面我們就來(lái)實(shí)現一下。首先,我們需要鍵一張數據庫表persistent_logins:
CREATE TABLE `persistent_logins` ( `username` varchar(64) NOT NULL, `series` varchar(64) NOT NULL, `token` varchar(64) NOT NULL, `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`series`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
初始化一個(gè)PersistentTokenRepository類(lèi)型的Spring bean,并將系統使用的DataSource注入到該bean中。(當然前提一定是你已經(jīng)在Spring Boot的application.yml中配置好DataSource相關(guān)的連接屬性,這里不再贅述)
@Autowiredprivate DataSource dataSource; @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); return tokenRepository; }
最后在Spring Security配置方法configure(HttpSecurity http)加上如下的個(gè)性化配置:
.rememberMe() .tokenRepository(persistentTokenRepository())
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站