溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringSecurity如何實現(xiàn)兩周內(nèi)自動登錄記住我功能

發(fā)布時間:2021-09-27 15:14:14 來源:億速云 閱讀:228 作者:小新 欄目:編程語言

這篇文章主要介紹SpringSecurity如何實現(xiàn)兩周內(nèi)自動登錄記住我功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一、最簡實踐

其實實現(xiàn)這個功能非常簡單,只需要我們在重寫WebSecurityConfigurerAdapter 方法配置HttpSecurity 的時候增加rememberMe()方法。(下面代碼中省略了大量的關(guān)于Spring Security登錄驗證的配置,在本號此前的文章中已經(jīng)講過)

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {    http.rememberMe();  //實現(xiàn)記住我自動登錄配置,核心的代碼只有這一行  }}

然后在登錄表單中加入一個checkbox勾選框,name屬性的值目前必須是“remember-me”(個性化更改的方法后面會講)。

<label><input type="checkbox" name="remember-me"/>自動登錄</label>

就是這么簡單,我們就實現(xiàn)了記住我功能,默認效果是:2周內(nèi)免登錄。

二、實現(xiàn)原理

很多朋友可能看了上面的實現(xiàn)過程心里都犯懵,這樣就實現(xiàn)了?下面和大家說明一下這過程中間,都做了哪些事情。

當我們登陸的時候,除了用戶名、密碼,我們還可以勾選remember-me。  如果我們勾選了remember-me,當我們登錄成功之后服務(wù)端會生成一個Cookie返回給瀏覽器,這個Cookie的名字默認是remember-me;值是一個token令牌。  當我們在有效期內(nèi)再次訪問應(yīng)用時,經(jīng)過RememberMeAuthenticationFilter,讀取Cookie中的token進行驗證。驗正通過不需要再次登錄就可以進行應(yīng)用訪問。

這個token令牌是一個 MD5 hash字符串:包含username、expirationTime和passwod和一個預(yù)定義的key,并將他們經(jīng)過MD5加密??赡苡械呐笥褧枺哼@樣安全么?如果cookie被劫持,一定是不安全的,別人拿到了這個字符串在有效期內(nèi)就可以訪問你的應(yīng)用。這就和你的鑰匙token被盜了,你家肯定不安全是一個道理。 但是不存在密碼被破解為明文的可能性,MD5 hash是不可逆的。

RememberMeAuthenticationFilter在Spring Security過濾器鏈中處于整體偏后的位置,所以只有當各種傳統(tǒng)的登錄方式都無法完成驗證的情況下,才走RememberMeAuthenticationFilter,這也是符合實際需求的。

三、個性化配置

在實際的開發(fā)過程中,我們還可以根據(jù)需求做一些個性化的設(shè)置,如下:

.rememberMe()  .rememberMeParameter("remember-me-new")  .rememberMeCookieName("remember-me-cookie")  .tokenValiditySeconds(2 * 24 * 60 * 60);

tokenValiditySeconds用于設(shè)置token的有效期,即多長時間內(nèi)可以免除重復(fù)登錄,單位是秒。不修改配置情況下默認是2周。

通過rememberMeParameter設(shè)置from表單“自動登錄”勾選框的參數(shù)名稱。如果這里改了,from表單中checkbox的name屬性要對應(yīng)的更改。如果不設(shè)置默認是remember-me。

rememberMeCookieName設(shè)置了保存在瀏覽器端的cookie的名稱,如果不設(shè)置默認也是remember-me。如下圖中查看瀏覽器的cookie。

四、token數(shù)據(jù)庫存儲方式

上面我們講的方式,就是最簡單的實現(xiàn)“記住我-自動登錄”功能的方式。這種方式的缺點在于:token與用戶的對應(yīng)關(guān)系是在內(nèi)存中存儲的,當我們重啟應(yīng)用之后所有的token都將消失,即:所有的用戶必須重新登陸。為此,Spring Security還給我們提供了一種將token存儲到數(shù)據(jù)庫中的方式,重啟應(yīng)用也不受影響。

有的文章說使用數(shù)據(jù)庫存儲方式是因為這種方式更安全,筆者不這么認為。雖然數(shù)據(jù)庫存儲的token的確不再是用戶名、密碼MD5加密字符串了,而是一個隨機序列號。但是一旦你的隨機序列號cookie被劫持,效果是一樣的。好比你家有把密碼鎖:你把鑰匙丟了和你把密碼丟了,危害性是一樣的。

上圖是token數(shù)據(jù)庫存儲方式的實現(xiàn)原理和驗證過程,下面我們就來實現(xiàn)一下。首先,我們需要鍵一張數(shù)據(jù)庫表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;

初始化一個PersistentTokenRepository類型的Spring bean,并將系統(tǒng)使用的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)加上如下的個性化配置:

.rememberMe()  .tokenRepository(persistentTokenRepository())

以上是“SpringSecurity如何實現(xiàn)兩周內(nèi)自動登錄記住我功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI