1. 程式人生 > >spring security使用自定義登錄界面後,不能返回到之前的請求界面的問題

spring security使用自定義登錄界面後,不能返回到之前的請求界面的問題

auth authent pri 源碼 ring 是把 根據 可能 oca

昨天因為集成spring security oauth2,所以對之前spring security的配置進行了一些修改,然後就導致登錄後不能正確跳轉回被攔截的頁面,而是返回到localhost根目錄。

開始以為是被oauth2攔截了導致出了問題,但是security的攔截器是優先起作用的,所以這不可能。

最後實在沒法只有打斷點調試找毛病(下圖為spring security登錄後重定向至攔截前訪問的url的實現原理流程)

技術分享圖片

圖片是在這裏看到的https://blog.csdn.net/zy_cookie/article/details/49535413

從圖上可以看出保存 被攔截的request是在 這個類裏進行的

HttpSessionRequestCache

在IDEA裏搜索這個類,在saveRequest方法設置一個斷點,然後進行調試

調試發現當瀏覽器輸入權限限制的url時(如/admin/console),系統會調用saveRequest方法對當前request對象進行緩存(如下圖所示)

技術分享圖片

既然保存的是/admin/console,但是為啥取出來的是/呢,繼續執行就發現問題了,系統又調用了一次saveRequest方法,而這次保存的request對象是“/”路徑的

技術分享圖片

也就是說之前保存的就是被這個給覆蓋了,通過源碼可以發現,saveRequest方法中是把request對象緩存到session,而且key值為靜態值(由此可見如果我們想要自定義一些方法時可以通過該key值取出保存的request對象,不過系統也提供了getRequst方法)

技術分享圖片

技術分享圖片

根據流程圖可知只有被攔截的請求才會被捕獲保存起來,於是我去檢查我webSercurityConfig,發現除了靜態資源其他的資源全都需要驗證,也因此“/”根目錄被攔截了,把“/”添加到排除列表後問題解決

通過後續的調試發現“/”是因為我自定義的登錄頁面發出的該請求

值得註意的是spring security完成用戶登錄後跳轉會原頁面的處理是在

SavedRequestAwareAuthenticationSuccessHandler類裏面進行的,如果想要自定義登錄成功後的操作可以繼承該類,重寫該方法

技術分享圖片

不過我當時寫的時候因為生成的代碼裏自動生成調用父類的該方法導致獲取不到saveRequest(就是下面這行)

技術分享圖片

原因是在

SavedRequestAwareAuthenticationSuccessHandler類處理時,獲取到saveRequst後會對session中緩存的進行刪除

技術分享圖片


spring security使用自定義登錄界面後,不能返回到之前的請求界面的問題