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