最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、最簡(jiǎn)實(shí)踐

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

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

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

<label><input type="checkbox" name="remember-me"/>自動(dòng)登錄</label>

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

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

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

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

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

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

三、個(gè)性化配置

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

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

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

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

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

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

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

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

上圖是token數(shù)據(jù)庫(kù)存儲(chǔ)方式的實(shí)現(xiàn)原理和驗(yàn)證過(guò)程,下面我們就來(lái)實(shí)現(xiàn)一下。首先,我們需要鍵一張數(shù)據(jù)庫(kù)表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,并將系統(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)加上如下的個(gè)性化配置:

.rememberMe()
  .tokenRepository(persistentTokenRepository())

總結(jié)

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

相關(guān)文章

  • java 排序算法之希爾算法

    java 排序算法之希爾算法

    這篇文章主要介紹了java 排序算法之希爾排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 簡(jiǎn)述IDEA集成Git在實(shí)際項(xiàng)目中的運(yùn)用

    簡(jiǎn)述IDEA集成Git在實(shí)際項(xiàng)目中的運(yùn)用

    這篇文章主要介紹了IDEA集成Git在實(shí)際項(xiàng)目中的運(yùn)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Golang Protocol Buffer案例詳解

    Golang Protocol Buffer案例詳解

    這篇文章主要介紹了Golang Protocol Buffer案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring MVC   文件、cookies的接收 與REST響應(yīng)詳解

    Spring MVC   文件、cookies的接收 與REST響應(yīng)詳

    在SpringMVC中,使用@RequestPart注解可接收文件并處理多部分請(qǐng)求,同時(shí)可以通過(guò)@CookieValue和HttpServletResponse來(lái)獲取和設(shè)置Cookies,本文介紹Spring MVC   文件、cookies的接收 與REST響應(yīng),感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Springboot使用SPI注冊(cè)bean到spring容器的示例代碼

    Springboot使用SPI注冊(cè)bean到spring容器的示例代碼

    這篇文章主要介紹了Springboot使用SPI注冊(cè)bean到spring容器,主要包括mydriver接口,mysqldriver實(shí)現(xiàn)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 詳解Java日志正確使用姿勢(shì)

    詳解Java日志正確使用姿勢(shì)

    這篇文章主要介紹了Java日志正確使用姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn)

    java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn)

    本文主要介紹了java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java中HashTable和HashMap的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中HashTable和HashMap的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    HashTable和HashMap主要的區(qū)別有:線(xiàn)程安全性,同步(synchronization),以及速度。接下來(lái)通過(guò)本文給大家簡(jiǎn)單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧
    2017-04-04
  • Java簡(jiǎn)化復(fù)雜系統(tǒng)調(diào)用的門(mén)面設(shè)計(jì)模式

    Java簡(jiǎn)化復(fù)雜系統(tǒng)調(diào)用的門(mén)面設(shè)計(jì)模式

    Java門(mén)面模式是一種結(jié)構(gòu)性設(shè)計(jì)模式,它為復(fù)雜系統(tǒng)提供了一個(gè)簡(jiǎn)單的接口,使得系統(tǒng)的客戶(hù)端能夠更加方便地使用系統(tǒng)功能。門(mén)面模式通過(guò)封裝復(fù)雜的子系統(tǒng),隱藏系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),提高了系統(tǒng)的易用性和靈活性
    2023-04-04
  • 2020Mac M1安裝jdk和IDEA的詳細(xì)方法

    2020Mac M1安裝jdk和IDEA的詳細(xì)方法

    這篇文章主要介紹了2020Mac M1安裝jdk和IDEA的詳細(xì)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

紫金县| 青浦区| 辉县市| 文水县| 九龙坡区| 筠连县| 连城县| 兰州市| 鄂尔多斯市| 万载县| 南岸区| 金昌市| 十堰市| 施甸县| 陇南市| 玉树县| 商南县| 大渡口区| 于都县| 永济市| 甘南县| 邵武市| 蓝山县| 玉山县| 凌源市| 手游| 乌审旗| 临湘市| 乐安县| 台江县| 兰考县| 康保县| 新泰市| 通州市| 榆中县| 文登市| 资中县| 兴隆县| 嵊泗县| 台中县| 扶绥县|