Spring Security 實戰 - Remember me
有個使用者初訪並登入了你的網站,然而第二天又來了,卻必須再次登入
於是就有了“記住我”這樣的功能來方便使用者使用,然而有一件不言自明的事情,那就是這種認證狀態的”曠日持久“早已超出了使用者原本所需要的使用範圍
這意味著,他們可以關閉瀏覽器,然後再關閉電腦,下週或者下個月,乃至更久以後再回來,只要這間隔時間不要太離譜,該網站總會知道誰是誰,並一如既往的為他們提供所有相同的功能和服務——與許久前他們離開的時候別無二致。
1 基本原理

- 使用者認證成功之後呼叫
RemeberMeService
根據使用者名稱名生成Token由TokenRepository
寫到資料庫,同時也將Token寫入到瀏覽器的Cookie中 - 重啟服務之後,使用者再次登入系統會由
RememberMeAuthenticationFilter
過濾,從Cookie中讀取Token資訊,與persistent_logins
表匹配判斷是否使用記住我功能 - 最後由
UserDetailsService
查詢使用者資訊
2 實現
2.1 建表

2.2 登陸頁面新增記住我複選框
name須為remeber-me



2.3 配置 MerryyouSecurityConfig

3 效果


4 原始碼分析
4.1 首次登入
AbstractAuthenticationProcessingFilter#successfulAuthentication

protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { ... // 1 將已認證過的Authentication置於SecurityContext SecurityContextHolder.getContext().setAuthentication(authResult); // 2 登入成功呼叫rememberMeServices rememberMeServices.loginSuccess(request, response, authResult); // Fire event if (this.eventPublisher != null) { eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent( authResult, this.getClass())); } successHandler.onAuthenticationSuccess(request, response, authResult); }
AbstractRememberMeServices#loginSuccess
