欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能

 更新時間:2019年11月28日 13:32:34   作者:字母哥博客  
登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。今天小編給大家分享基于Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能,感興趣的朋友一起看看吧

本文是Spring Security系列中的一篇。在上一篇文章中,我們通過實(shí)現(xiàn)UserDetailsService和UserDetails接口,實(shí)現(xiàn)了動態(tài)的從數(shù)據(jù)庫加載用戶、角色、權(quán)限相關(guān)信息,從而實(shí)現(xiàn)了登錄及授權(quán)相關(guān)的功能。這一節(jié)就在此基礎(chǔ)上新增,登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。該功能的作用就是:當(dāng)我們登錄成功之后,一定的周期內(nèi)當(dāng)我們再次訪問該網(wǎng)站,不需要重新登錄。

一、最簡實(shí)踐

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

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

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

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

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

二、實(shí)現(xiàn)原理

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

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

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

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

三、個性化配置

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

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

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

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

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

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

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

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

上圖是token數(shù)據(jù)庫存儲方式的實(shí)現(xiàn)原理和驗(yàn)證過程,下面我們就來實(shí)現(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中。(當(dāng)然前提一定是你已經(jīng)在Spring Boot的application.yml中配置好DataSource相關(guān)的連接屬性,這里不再贅述)

@Autowired
private DataSource dataSource;
 @Bean
 public PersistentTokenRepository persistentTokenRepository(){
   JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
   tokenRepository.setDataSource(dataSource);
   return tokenRepository;
 }

最后在Spring Security配置方法configure(HttpSecurity http)加上如下的個性化配置:

.rememberMe()
  .tokenRepository(persistentTokenRepository())

總結(jié)

以上所述是小編給大家介紹的Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java中使用fastjson設(shè)置字段不序列化

    Java中使用fastjson設(shè)置字段不序列化

    這篇文章主要介紹了Java中使用fastjson設(shè)置字段不序列化,alibaba的fasetjson可以設(shè)置字段不序列化,使用@JSONField注解的serialize屬性,該屬性默認(rèn)是可以序列化的,設(shè)置成false就表示不可序列化,需要的朋友可以參考下
    2023-12-12
  • SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼

    SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼

    本文主要介紹了SpringBoot整合token實(shí)現(xiàn)登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • IDEA 中 maven 的 Lifecycle 和Plugins 的區(qū)別

    IDEA 中 maven 的 Lifecycle 和Plugins&n

    IDEA 主界面右側(cè) Maven 標(biāo)簽欄有同樣的命令,比如 install,既在 Plugins 中存在,也在 Lifecycle中存在,到底選哪個?二者又有什么區(qū)別呢?下面小編給大家介紹下IDEA 中 maven 的 Lifecycle 和Plugins 的區(qū)別,感興趣的朋友一起看看吧
    2023-03-03
  • Java實(shí)現(xiàn)圓形碰撞檢測

    Java實(shí)現(xiàn)圓形碰撞檢測

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圓形碰撞檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制

    從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制

    這篇文章主要介紹了從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制,帶有GC是Java語言的重要特性之一,需要的朋友可以參考下
    2015-11-11
  • mybatis清除一級緩存的幾種方式

    mybatis清除一級緩存的幾種方式

    這篇文章主要介紹了mybatis清除一級緩存的幾種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 如何從Java接口的角度切入靜態(tài)工廠模式

    如何從Java接口的角度切入靜態(tài)工廠模式

    靜態(tài)工廠模式是一種改進(jìn)的獲取實(shí)例的方法。通常我們會使用new關(guān)鍵字調(diào)用類的構(gòu)造方法來創(chuàng)建一個對象。靜態(tài)工廠可以根據(jù)用戶傳入的參數(shù)來動態(tài)地實(shí)例化對象,避免一次性實(shí)例化所有對象所帶來的性能浪費(fèi),同時也降低了耦合性。
    2021-06-06
  • jvm堆外內(nèi)存排查圖文舉例詳解

    jvm堆外內(nèi)存排查圖文舉例詳解

    Java應(yīng)用程序通過直接方式從操作系統(tǒng)中申請的內(nèi)存,叫堆外內(nèi)存,這篇文章主要給大家介紹了關(guān)于jvm堆外內(nèi)存排查的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例

    Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例

    這篇文章主要介紹了Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實(shí)例形式分析了java觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計(jì)原則與適用場合,具有一定參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • Java流程控制順序結(jié)構(gòu)原理解析

    Java流程控制順序結(jié)構(gòu)原理解析

    這篇文章主要介紹了Java流程控制順序結(jié)構(gòu)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論