SpringSecurity rememberme功能實現過程解析
阿新 • • 發佈:2020-03-05
記住我功能原理分析
還記得前面咱們分析認證流程時,提到的記住我功能嗎?
現在繼續跟蹤找到AbstractRememberMeServices物件的loginSuccess方法:
再點進去上面if判斷中的rememberMeRequested方法,還在當前類中:
如果上面方法返回true,就表示頁面勾選了記住我選項了。
繼續順著呼叫的方法找到PersistentTokenBasedRememberMeServices的onLoginSuccess方法:
注意name和value屬性的值不要寫錯哦!
先測試一下,認證通過後,關掉瀏覽器,再次開啟頁面,發現還要認證!為什麼沒有起作用呢?
開啟remember me過濾器
<security:remember-me token-validity-seconds="60"></security:remember-me>
說明:RememberMeAuthenticationFilter中功能非常簡單,會在開啟瀏覽器時,自動判斷是否認證,如果沒有則
呼叫autoLogin進行自動認證。
remember me 安全性分析
記住我功能方便是大家看得見的,但是安全性卻令人擔憂。因為 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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。