您好,登錄后才能下訂單哦!
本文是Spring Security系列中的一篇。在上一篇文章中,我們通過實現UserDetailsService和UserDetails接口,實現了動態的從數據庫加載用戶、角色、權限相關信息,從而實現了登錄及授權相關的功能。這一節就在此基礎上新增,登錄過程中經常使用的“記住我”功能,也就是我們經常會在各種網站登陸時見到的"兩周內免登錄",“三天內免登錄”的功能。該功能的作用就是:當我們登錄成功之后,一定的周期內當我們再次訪問該網站,不需要重新登錄。
一、最簡實踐
其實實現這個功能非常簡單,只需要我們在重寫WebSecurityConfigurerAdapter 方法配置HttpSecurity 的時候增加rememberMe()方法。(下面代碼中省略了大量的關于Spring Security登錄驗證的配置,在本號此前的文章中已經講過)
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.rememberMe(); //實現記住我自動登錄配置,核心的代碼只有這一行 } }
然后在登錄表單中加入一個checkbox勾選框,name屬性的值目前必須是“remember-me”(個性化更改的方法后面會講)。
<label><input type="checkbox" name="remember-me"/>自動登錄</label>
就是這么簡單,我們就實現了記住我功能,默認效果是:2周內免登錄。
二、實現原理
很多朋友可能看了上面的實現過程心里都犯懵,這樣就實現了?下面和大家說明一下這過程中間,都做了哪些事情。
這個token令牌是一個 MD5 hash字符串:包含username、expirationTime和passwod和一個預定義的key,并將他們經過MD5加密。可能有的朋友會問:這樣安全么?如果cookie被劫持,一定是不安全的,別人拿到了這個字符串在有效期內就可以訪問你的應用。這就和你的鑰匙token被盜了,你家肯定不安全是一個道理。 但是不存在密碼被破解為明文的可能性,MD5 hash是不可逆的。
RememberMeAuthenticationFilter在Spring Security過濾器鏈中處于整體偏后的位置,所以只有當各種傳統的登錄方式都無法完成驗證的情況下,才走RememberMeAuthenticationFilter,這也是符合實際需求的。
三、個性化配置
在實際的開發過程中,我們還可以根據需求做一些個性化的設置,如下:
.rememberMe() .rememberMeParameter("remember-me-new") .rememberMeCookieName("remember-me-cookie") .tokenValiditySeconds(2 * 24 * 60 * 60);
tokenValiditySeconds用于設置token的有效期,即多長時間內可以免除重復登錄,單位是秒。不修改配置情況下默認是2周。
通過rememberMeParameter設置from表單“自動登錄”勾選框的參數名稱。如果這里改了,from表單中checkbox的name屬性要對應的更改。如果不設置默認是remember-me。
rememberMeCookieName設置了保存在瀏覽器端的cookie的名稱,如果不設置默認也是remember-me。如下圖中查看瀏覽器的cookie。
四、token數據庫存儲方式
上面我們講的方式,就是最簡單的實現“記住我-自動登錄”功能的方式。這種方式的缺點在于:token與用戶的對應關系是在內存中存儲的,當我們重啟應用之后所有的token都將消失,即:所有的用戶必須重新登陸。為此,Spring Security還給我們提供了一種將token存儲到數據庫中的方式,重啟應用也不受影響。
有的文章說使用數據庫存儲方式是因為這種方式更安全,筆者不這么認為。雖然數據庫存儲的token的確不再是用戶名、密碼MD5加密字符串了,而是一個隨機序列號。但是一旦你的隨機序列號cookie被劫持,效果是一樣的。好比你家有把密碼鎖:你把鑰匙丟了和你把密碼丟了,危害性是一樣的。
上圖是token數據庫存儲方式的實現原理和驗證過程,下面我們就來實現一下。首先,我們需要鍵一張數據庫表persistent_logins:
CREATE TABLE `persistent_logins` ( `username` varchar(64) NOT NULL, `series` varchar(64) NOT NULL, `token` varchar(64) NOT NULL, `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`series`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
初始化一個PersistentTokenRepository類型的Spring bean,并將系統使用的DataSource注入到該bean中。(當然前提一定是你已經在Spring Boot的application.yml中配置好DataSource相關的連接屬性,這里不再贅述)
@Autowired private DataSource dataSource; @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); return tokenRepository; }
最后在Spring Security配置方法configure(HttpSecurity http)加上如下的個性化配置:
.rememberMe() .tokenRepository(persistentTokenRepository())
總結
以上所述是小編給大家介紹的Spring Security實現兩周內自動登錄"記住我"功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。