Spring Security 自定義登錄成功后的邏輯
環(huán)境:Spring Boot 2.2.11.RELEASE + Spring Security5.2.7
說下背景:我們有個項目是基于NW.js,用戶登錄是通過Spring Security來實現(xiàn)的。我們在nw.js環(huán)境下做了一個校驗,如果用戶2小時內(nèi)沒有任何的操作那么系統(tǒng)將自動調(diào)整到登錄頁面;這樣就出現(xiàn)了問題,我們有很多的用戶是7*24小時不關(guān)電腦的。當(dāng)用戶下班2小時后系統(tǒng)就自動跳轉(zhuǎn)到了登錄頁面,第二天用戶上班了后登錄系統(tǒng)調(diào)不到之前的操作頁面。用戶天天投訴。其實當(dāng)我們訪問需要用戶認證的頁面時沒登錄情況下都會跳到登錄頁如果30分鐘內(nèi)什么都不操作同樣也是跳不回去的。
基于上面的問題后來跟蹤了下源碼發(fā)現(xiàn)Spring Security是通過session來保存之前的請求的所有相關(guān)信息,源碼如下:
認證通過后執(zhí)行下面的邏輯
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);
- }
這里就是把當(dāng)前的request對象進行了保存然后放到了session中,保存后再跳轉(zhuǎn)到登錄授權(quán)頁面。session不配置的情況下默認就是30分鐘。
當(dāng)時為了簡單快速解決問題,我之間吧session的有效性調(diào)整了1天時間,安靜了一段時間后,以為沒事了。萬萬沒想到后來有幾個用戶有投訴了o(╥﹏╥)o,大概了解了下他們說有時候幾天才用一次系統(tǒng)(就這樣他們還是不關(guān)電腦)。。。沒辦法只能繼續(xù)改代碼了。
通過上面貼的源碼也知道了就是從session獲取到之前的request對象然后進行了重定向。
在配置HttpSecurity時配置自定義sucessHandler,如下
nw.js在做跳轉(zhuǎn)的時候,我把用戶之前的操作頁面地址記錄下來作為一個參數(shù)傳遞。這樣就不怕session過期了。