国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

springsecurity如何實(shí)現下次自動(dòng)登錄功能過(guò)程解析

發(fā)布時(shí)間:2021-09-27 17:50 來(lái)源:億速云 閱讀:0 作者:小新 欄目: 開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細講解有關(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í),將立刻刪除涉嫌侵權內容。

精品免费久久久久久久| 99ee6这里只有精品热| 久久久久99精品成人片欧美| 狼色精品人妻在线视频| 大陆熟妇丰满多毛XXXX| 亚洲成A人V欧美综合天堂麻豆|