- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- springsecurity如何實(shí)現下次自動(dòng)登錄功能過(guò)程解析
這篇文章將為大家詳細講解有關(guān)springsecurity如何實(shí)現下次自動(dòng)登錄功能過(guò)程解析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一、原理分析
第一次登陸時(shí),如果用戶(hù)勾選了readme選項,登陸成功后springsecurity會(huì )生成一個(gè)cookie返回給瀏覽器端,瀏覽器下次訪(fǎng)問(wèn)時(shí)如果攜帶了這個(gè)cookie,springsecurity就會(huì )放行這次訪(fǎng)問(wèn)。
二、實(shí)現方式
2.1 簡(jiǎn)單實(shí)現方式
(1) 在springsecurity的配置文件中,http節點(diǎn)下增加一個(gè)remember-me配置
<security:http auto-config="true" use-expressions="false"> <!-- 配置鏈接地址,表示任意路徑都需要ROLE_USER權限,這里可以配置 一個(gè)逗號隔開(kāi)的角色列表--> <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,默認是開(kāi)啟的--> <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"指定前臺傳遞的是否rememberme的參數名,前臺要傳遞的參數值是true或false
(2)前臺登錄頁(yè)面上增加一個(gè)checkbox
<form action="/login" method="post"> 用戶(hù)名:<input type="text" name="username" placeholder="請輸入用戶(hù)名"><br> 密 碼:<input type="password" name="password" placeholder="請輸入密碼"><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)測試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后觀(guān)察cookie,會(huì )發(fā)現端返回了一個(gè)名為remember-me的cookie
現在關(guān)閉瀏覽器,再次打開(kāi)并訪(fǎng)問(wèn),只要不清除cookie就可以直接訪(fǎng)問(wèn)資源,不需要重新登錄。
這種方式有個(gè)弊端,瀏覽器端要攜帶的這個(gè)cookie值服務(wù)端是存放在內存中的,并沒(méi)有進(jìn)行持久化,所以如果服務(wù)重啟后服務(wù)器端存儲的這個(gè)值就會(huì )丟失,瀏覽器端的rememberme就會(huì )失效。為了解決這個(gè)問(wèn)題就需要將服務(wù)器端生成的這個(gè)cookie值持久化到數據庫中。
2.2 數據庫實(shí)現方式
(1)創(chuàng )建一張表用來(lái)持久化rememberme的記錄
-- 創(chuàng )建記錄rememberme記錄的表
CREATE TABLE persistent_logins( username VARCHAR(64), series VARCHAR(64), token VARCHAR(64), last_used DATE );
(2)將spring-security 配置文件中的rememberme標簽的內容改為如下內容
<security:remember-me remember-me-parameter="remembermeParamater" data-source-ref="dataSource" token-validity-seconds="86400"/>
data-source-ref="dataSource"用來(lái)指定數據源,spring-security通過(guò)數據源來(lái)操作數據庫中的persistent_logins表
token-validity-seconds表示rememberme的有效時(shí)間,以秒為單位,這里的86400=24*3600表示一天
(3)測試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后會(huì )在persistent_logins表中生成一條記錄,
關(guān)閉瀏覽器再次訪(fǎng)問(wèn)時(shí)會(huì )根據瀏覽器中攜帶的cookie值來(lái)查找數據庫中的這條記錄,如果查詢(xún)到了就認證通過(guò)
三、區分是密碼登錄還是rememberme登錄
在用戶(hù)進(jìn)行一些敏感操作時(shí),需要區分是否是rememberme登錄,如果是需要讓用戶(hù)跳轉到登錄頁(yè)面。
在congtroller層提供一個(gè)方法來(lái)進(jìn)行判斷
@GetMapping("/isRemembermeUser")public boolean isRemembermeUser(){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication==null){ return false; } //判斷當前用戶(hù)是否是通過(guò)rememberme登錄,是返回true,否返回false return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass());}
先使用密碼登錄,訪(fǎng)問(wèn)http://localhost/user/isRemembermeUser.do,后臺接口返回false,再關(guān)閉瀏覽器再次訪(fǎng)問(wèn)這個(gè)地址,后臺接口返回true,表示這次是使用rememberme進(jìn)行的認證。
免責聲明:本站發(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)站