Spring Security安全框架之記住我功能
簡介
在一般的網站中,比如Bilibili
。當用戶登錄成功後,關閉瀏覽器後,下次重新進入網站,可以自動登錄。
本次就來探究如何實現這種自動登錄
、記住我
的功能。
思維邏輯
需要實現記住我
的功能操作,需要保證具體的實現方式,接下來就來梳理下。
首先,在Security
框架中,針對記住我
的功能實現,Security
框架本身對其做瞭一定的封裝,其實現原理為:
- 瀏覽器:cookie中存儲加密後的數據串
- 數據庫:MySQL等數據庫中存儲
加密後的數據串
和用戶基本信息
數據。
當認證器中,根據客戶端傳遞的cookie值,查詢服務器,符合用戶基本信息,則自動放行。
配置和測試
數據庫創建
本質上是不要創建的,Security
框架針對記住我
功能的實現,會在數據庫不存在表時,org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl
自動創建一個persistent_logins
表。
如果想手動創建,可以執行下列sql進行表的創建:
CREATE TABLE persistent_logins ( username VARCHAR ( 64 ) NOT NULL, series VARCHAR ( 64 ) PRIMARY KEY, token VARCHAR ( 64 ) NOT NULL, last_used TIMESTAMP NOT NULL );
配置類註入數據源,配置操作數據庫對象
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import javax.sql.DataSource; /** * 註入數據源(記住我) */ @Autowired private DataSource dataSource; /** * 配置操作數據庫對象 * @return @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); jdbcTokenRepository.setCreateTableOnStartup(true); // 如果沒有配置記住我的數據表,則自動生成 return jdbcTokenRepository; }
配置config(HttpSecurity)
.and() .rememberMe().tokenRepository(persistentTokenRepository()) // 配置記住我的功能,同時增加查詢數據庫 cookie 值 .tokenValiditySeconds(60) // 設置cookie的有效時間(秒為單位) .userDetailsService(mySecurityService) // 查詢數據庫
頁面增加記住我選項
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/user/login" method="post"> 用戶名:<input type="text" name="username" /><br/> 密碼:<input type="text" name="password" /><br/> <input type="checkbox" name="remember-me" title="記住我" />自動登錄<br/> <input type="submit" value="login" /><br/> </form> </body> </html>
主要代碼為:
<input type="checkbox" name="remember-me" title="記住我" />自動登錄<br/>
【註意:】name="remember-me" 這是固定寫法,否則無法識別!
測試
重啟服務器,請求需要被認證的url:
http://localhost/login.html
關閉瀏覽器,重新打開,重新請求:
http://localhost/loginSuccess.html
註意事項
由於數據庫
本身未創建
persistent_logins
表,隻是在配置類中申明創建表
:
此時數據庫中,可以看到已存在表信息:
此處需要註意的是,如果配置瞭自動創建表,如果已存在指定的表,啟動會報錯!
原理分析
1、瀏覽器請求服務器時,會先經過UsernamePasswordAuthenticationFilter
進行認證操作
2、如果UsernamePasswordAuthenticationFilter
認證成功,會調用其父類 AbstractAuthenticationProcessingFilter
中的doFilter
方法。
3、最終執行this.successfulAuthentication(request, response, chain, authResult)
。
即org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
中的loginSuccess
方法。
然後在org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#onLoginSuccess
中做以下操作:
4、將生成的新的token信息,存儲於數據表中,並且也存儲在瀏覽器 cookie 中
。
5、當瀏覽器關閉,下次登錄時,會根據之前設定的remember-me
信息,在org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter
中對其驗證!
代碼下載
springboot-security-09-rememberMe
gitee 代碼下載
到此這篇關於Spring Security安全框架之記住我的文章就介紹到這瞭,更多相關Spring Security記住我內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- springboot整合security和vue的實踐
- Spring boot Thymeleaf配置國際化頁面詳解
- SpringBoot+Spring Security無法實現跨域的解決方案
- Spring Security實現自動登陸功能示例
- Spring Security的簡單使用