Spring Security 自定義登錄成功后的邏輯
環境:Spring Boot 2.2.11.RELEASE + Spring Security5.2.7
說下背景:我們有個項目是基于NW.js,用戶登錄是通過Spring Security來實現的。我們在nw.js環境下做了一個校驗,如果用戶2小時內沒有任何的操作那么系統將自動調整到登錄頁面;這樣就出現了問題,我們有很多的用戶是7*24小時不關電腦的。當用戶下班2小時后系統就自動跳轉到了登錄頁面,第二天用戶上班了后登錄系統調不到之前的操作頁面。用戶天天投訴。其實當我們訪問需要用戶認證的頁面時沒登錄情況下都會跳到登錄頁如果30分鐘內什么都不操作同樣也是跳不回去的。
基于上面的問題后來跟蹤了下源碼發現Spring Security是通過session來保存之前的請求的所有相關信息,源碼如下:
認證通過后執行下面的邏輯
AbstractAuthenticationProcessingFilter.java
這里的successHandler默認是使用的如下handler。
SavedRequestAwareAuthenticationSuccessHandler.java
requestCache對象的實例是HttpSessionRequestCache
HttpSessionRequestCache.java部分源碼
- DefaultSavedRequest savedRequest = new DefaultSavedRequest(request,portResolver);
- if (createSessionAllowed || request.getSession(false) != null) {
- request.getSession().setAttribute(this.sessionAttrName, savedRequest);
- logger.debug("DefaultSavedRequest added to Session: " + savedRequest);
- }
這里就是把當前的request對象進行了保存然后放到了session中,保存后再跳轉到登錄授權頁面。session不配置的情況下默認就是30分鐘。
當時為了簡單快速解決問題,我之間吧session的有效性調整了1天時間,安靜了一段時間后,以為沒事了。萬萬沒想到后來有幾個用戶有投訴了o(╥﹏╥)o,大概了解了下他們說有時候幾天才用一次系統(就這樣他們還是不關電腦)。。。沒辦法只能繼續改代碼了。
通過上面貼的源碼也知道了就是從session獲取到之前的request對象然后進行了重定向。
在配置HttpSecurity時配置自定義sucessHandler,如下
nw.js在做跳轉的時候,我把用戶之前的操作頁面地址記錄下來作為一個參數傳遞。這樣就不怕session過期了。