spring security實(shí)現(xiàn)下次自動(dòng)登錄功能過程解析
這篇文章主要介紹了spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
一、原理分析
第一次登陸時(shí),如果用戶勾選了readme選項(xiàng),登陸成功后springsecurity會(huì)生成一個(gè)cookie返回給瀏覽器端,瀏覽器下次訪問時(shí)如果攜帶了這個(gè)cookie,springsecurity就會(huì)放行這次訪問。
二、實(shí)現(xiàn)方式
2.1 簡(jiǎn)單實(shí)現(xiàn)方式
(1) 在springsecurity的配置文件中,http節(jié)點(diǎn)下增加一個(gè)remember-me配置
<security:http auto-config="true" use-expressions="false">
<!-- 配置鏈接地址,表示任意路徑都需要ROLE_USER權(quán)限,這里可以配置
一個(gè)逗號(hào)隔開的角色列表-->
<security:intercept-url pattern="/**" access="ROLE_USER"/>
<!--自定義登錄頁(yè)面-->
<security:form-login login-page="/login.html" login-processing-url="/login"
username-parameter="username" password-parameter="password"
authentication-failure-forward-url="/failed.html"
default-target-url="/index.html"
/>
<!--關(guān)閉csrf,默認(rèn)是開啟的-->
<security:csrf disabled="true"/>
<security:remember-me remember-me-parameter="remembermeParamater" />
<!-- 退出 -->
<security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.html"/>
</security:http>
其中remember-me-parameter="remembermeParamater"指定前臺(tái)傳遞的是否rememberme的參數(shù)名,前臺(tái)要傳遞的參數(shù)值是true或false
(2)前臺(tái)登錄頁(yè)面上增加一個(gè)checkbox
<form action="/login" method="post"> 用戶名:<input type="text" name="username" placeholder="請(qǐng)輸入用戶名"><br> 密 碼:<input type="password" name="password" placeholder="請(qǐng)輸入密碼"><br> 記住我:<input id="_spring_security_remember_me" type="checkbox" name="remembermeParamater" value="true"> <input type="submit" value="登錄"> </form>
checkbox的name屬性要和上邊配置文件中的remember-me-parameter="remembermeParamater"保持一致。
(3)測(cè)試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后觀察cookie,會(huì)發(fā)現(xiàn)服務(wù)器端返回了一個(gè)名為remember-me的cookie

現(xiàn)在關(guān)閉瀏覽器,再次打開并訪問,只要不清除cookie就可以直接訪問資源,不需要重新登錄。
這種方式有個(gè)弊端,瀏覽器端要攜帶的這個(gè)cookie值服務(wù)端是存放在內(nèi)存中的,并沒有進(jìn)行持久化,所以如果服務(wù)重啟后服務(wù)器端存儲(chǔ)的這個(gè)值就會(huì)丟失,瀏覽器端的rememberme就會(huì)失效。為了解決這個(gè)問題就需要將服務(wù)器端生成的這個(gè)cookie值持久化到數(shù)據(jù)庫(kù)中。
2.2 數(shù)據(jù)庫(kù)實(shí)現(xiàn)方式
(1)創(chuàng)建一張表用來持久化rememberme的記錄
-- 創(chuàng)建記錄rememberme記錄的表
CREATE TABLE persistent_logins ( username VARCHAR(64), series VARCHAR(64), token VARCHAR(64), last_used DATE );
(2)將spring-security 配置文件中的rememberme標(biāo)簽的內(nèi)容改為如下內(nèi)容
<security:remember-me remember-me-parameter="remembermeParamater" data-source-ref="dataSource"
token-validity-seconds="86400"/>
data-source-ref="dataSource"用來指定數(shù)據(jù)源,spring-security通過數(shù)據(jù)源來操作數(shù)據(jù)庫(kù)中的persistent_logins表
token-validity-seconds表示rememberme的有效時(shí)間,以秒為單位,這里的86400=24*3600表示一天
(3)測(cè)試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后會(huì)在persistent_logins表中生成一條記錄,

關(guān)閉瀏覽器再次訪問時(shí)會(huì)根據(jù)瀏覽器中攜帶的cookie值來查找數(shù)據(jù)庫(kù)中的這條記錄,如果查詢到了就認(rèn)證通過
三、區(qū)分是密碼登錄還是rememberme登錄
在用戶進(jìn)行一些敏感操作時(shí),需要區(qū)分是否是rememberme登錄,如果是需要讓用戶跳轉(zhuǎn)到登錄頁(yè)面。
在congtroller層提供一個(gè)方法來進(jìn)行判斷
@GetMapping("/isRemembermeUser")
public boolean isRemembermeUser(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication==null){
return false;
}
//判斷當(dāng)前用戶是否是通過rememberme登錄,是返回true,否返回false
return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass());
}
先使用密碼登錄,訪問http://localhost/user/isRemembermeUser.do,后臺(tái)接口返回false,再關(guān)閉瀏覽器再次訪問這個(gè)地址,后臺(tái)接口返回true,表示這次是使用rememberme進(jìn)行的認(rèn)證。
測(cè)試工程代碼的地址:工程示例
- SpringBoot 配合 SpringSecurity 實(shí)現(xiàn)自動(dòng)登錄功能的代碼
- Spring Security學(xué)習(xí)之rememberMe自動(dòng)登錄的實(shí)現(xiàn)
- Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過程詳解
- Spring Security實(shí)現(xiàn)兩周內(nèi)自動(dòng)登錄"記住我"功能
- 詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證
- Spring Security基于散列加密方案實(shí)現(xiàn)自動(dòng)登錄功能
相關(guān)文章
我從jdk1.8升級(jí)到j(luò)dk11所遇到的坑都有這些
這篇文章主要介紹了從jdk1.8升級(jí)到j(luò)dk11將會(huì)遇到的一些坑,本文給大家分享解決方案對(duì)大家的學(xué)習(xí)或工作具有參考借鑒價(jià)值,對(duì)jdk1.8升級(jí)到j(luò)dk11相關(guān)知識(shí)感興趣的朋友,快來看看吧2021-08-08
Maven根據(jù)不同環(huán)境打包不同配置文件的方法
這篇文章主要介紹了Maven根據(jù)不同環(huán)境打包不同配置文件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Java實(shí)現(xiàn)赫夫曼樹(哈夫曼樹)的創(chuàng)建
給定N個(gè)權(quán)值作為N個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長(zhǎng)度(WPL)達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。這篇文章主要就是為大家介紹如何通過Java實(shí)現(xiàn)赫夫曼樹,需要的朋友可以參考一下2021-12-12
SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫(kù)密碼的示例代碼
本篇文章主要介紹了SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫(kù)密碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
java中調(diào)用https請(qǐng)求忽略ssl證書認(rèn)證代碼示例
在網(wǎng)絡(luò)請(qǐng)求中經(jīng)常會(huì)遇到需要忽略證書認(rèn)證的情況,這篇文章主要介紹了java中調(diào)用https請(qǐng)求忽略ssl證書認(rèn)證的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
idea注解參數(shù)換行時(shí)間日期格式設(shè)置方法
這篇文章主要介紹了idea注解參數(shù)換行時(shí)間日期格式設(shè)置方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
使用Jmeter進(jìn)行http接口測(cè)試的實(shí)踐
本文主要針對(duì)http接口進(jìn)行測(cè)試,使用Jmeter工具實(shí)現(xiàn)。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
基于Java實(shí)現(xiàn)考試管理系統(tǒng)
這篇文章主要介紹了基于Java實(shí)現(xiàn)的考試管理系統(tǒng),項(xiàng)目運(yùn)用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12

