spring security實現下次自動登入功能過程解析
這篇文章主要介紹了spring security實現記住我下次自動登入功能,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一、原理分析
第一次登陸時,如果使用者勾選了readme選項,登陸成功後springsecurity會生成一個cookie返回給瀏覽器端,瀏覽器下次訪問時如果攜帶了這個cookie,springsecurity就會放行這次訪問。
二、實現方式
2.1 簡單實現方式
(1) 在springsecurity的配置檔案中,http節點下增加一個remember-me配置
<security:http auto-config="true" use-expressions="false"> <!-- 配置連結地址,表示任意路徑都需要ROLE_USER許可權,這裡可以配置 一個逗號隔開的角色列表--> <security:intercept-url pattern="/**" access="ROLE_USER"/> <!--自定義登入頁面--> <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" /> <!--關閉csrf,預設是開啟的--> <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)前臺登入頁面上增加一個checkbox
<form action="/login" method="post"> 使用者名稱:<input type="text" name="username" placeholder="請輸入使用者名稱"><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)測試
啟動工程,進行登入,登入成功後觀察cookie,會發現伺服器端返回了一個名為remember-me的cookie
現在關閉瀏覽器,再次開啟並訪問,只要不清除cookie就可以直接訪問資源,不需要重新登入。
這種方式有個弊端,瀏覽器端要攜帶的這個cookie值服務端是存放在記憶體中的,並沒有進行持久化,所以如果服務重啟後伺服器端儲存的這個值就會丟失,瀏覽器端的rememberme就會失效。為了解決這個問題就需要將伺服器端生成的這個cookie值持久化到資料庫中。
2.2 資料庫實現方式
(1)建立一張表用來持久化rememberme的記錄
-- 建立記錄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"用來指定資料來源,spring-security通過資料來源來操作資料庫中的persistent_logins表
token-validity-seconds表示rememberme的有效時間,以秒為單位,這裡的86400=24*3600表示一天
(3)測試
啟動工程,進行登入,登入成功後會在persistent_logins表中生成一條記錄,
關閉瀏覽器再次訪問時會根據瀏覽器中攜帶的cookie值來查詢資料庫中的這條記錄,如果查詢到了就認證通過
三、區分是密碼登入還是rememberme登入
在使用者進行一些敏感操作時,需要區分是否是rememberme登入,如果是需要讓使用者跳轉到登入頁面。
在congtroller層提供一個方法來進行判斷
@GetMapping("/isRemembermeUser") public boolean isRemembermeUser(){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication==null){ return false; } //判斷當前使用者是否是通過rememberme登入,是返回true,否返回false return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass()); }
先使用密碼登入,訪問http://localhost/user/isRemembermeUser.do,後臺介面返回false,再關閉瀏覽器再次訪問這個地址,後臺介面返回true,表示這次是使用rememberme進行的認證。
測試工程程式碼的地址:工程示例