1. 程式人生 > 程式設計 >SpringSecurity rememberme功能實現過程解析

SpringSecurity rememberme功能實現過程解析

記住我功能原理分析

還記得前面咱們分析認證流程時,提到的記住我功能嗎?

SpringSecurity rememberme功能實現過程解析

現在繼續跟蹤找到AbstractRememberMeServices物件的loginSuccess方法:

SpringSecurity rememberme功能實現過程解析

再點進去上面if判斷中的rememberMeRequested方法,還在當前類中:

SpringSecurity rememberme功能實現過程解析

如果上面方法返回true,就表示頁面勾選了記住我選項了。

繼續順著呼叫的方法找到PersistentTokenBasedRememberMeServices的onLoginSuccess方法:

SpringSecurity rememberme功能實現過程解析

注意name和value屬性的值不要寫錯哦!

SpringSecurity rememberme功能實現過程解析

先測試一下,認證通過後,關掉瀏覽器,再次開啟頁面,發現還要認證!為什麼沒有起作用呢?

這是因為remember me功能使用的過濾器RememberMeAuthenticationFilter預設是不開啟的!

開啟remember me過濾器

<security:remember-me token-validity-seconds="60"></security:remember-me>

說明:RememberMeAuthenticationFilter中功能非常簡單,會在開啟瀏覽器時,自動判斷是否認證,如果沒有則
呼叫autoLogin進行自動認證。

SpringSecurity rememberme功能實現過程解析

remember me 安全性分析

記住我功能方便是大家看得見的,但是安全性卻令人擔憂。因為 Cookie畢竟是儲存在客戶端的,很容易盜取,而且

cookie的值還與使用者名稱、密碼這些敏感資料相關,雖然加密了,但是將敏感資訊存在客戶端,還是不太安全。那麼
這就要提醒喜歡使用此功能的,用完網站要及時手動退出登入,清空認證資訊。

此外,SpringSecurity還提供了remember me的另一種相對更安全的實現機制 :在客戶端的cookie中,僅儲存一個
無意義的加密串(與使用者名稱、密碼等敏感資料無關),然後在db中儲存該加密串-使用者資訊的對應關係,自動登入
時,用cookie中的加密串,到db中驗證,如果通過,自動登入才算通過。

持久化remember me資訊

建立一張表,注意這張表的名稱和欄位都是固定的,不要修改。

 <security:remember-me token-validity-seconds="60"
               data-source-ref="dataSource"
     remember-me-parameter="remember-me"></security:remember-me>
CREATE TABLE `persistent_logins` (
`username` varchar(64) NOT NULL,`series` varchar(64) NOT NULL,`token` varchar(64) NOT NULL,`last_used` timestamp NOT NULL,PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SpringSecurity rememberme功能實現過程解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。