Spring Security深入淺出--2、認證流程源碼級詳解(二)

目錄

 

認證流程源碼級詳解

認證結果如何在多個請求之間共享

獲取認證用戶信息


認證流程源碼級詳解

認證結果如何在多個請求之間共享

也就是分析security是如何將請求信息保持在session當中的

接着上一篇源碼分析,講到處理到了AbstractAuthenticationProcessingFilter類中,在認證成功的情況下,調用successfulAuthentication(request, response, chain, authResult);之後

調用SecurityContextHolder.getContext().setAuthentication(authResult); 保持認證後的請求信息。

由於是函數式編程,我們從左往右一步步來分析,查看getContext()方法

最後調用的是SecurityContext的setAuthentication(authResult)方法,因爲它只是接口找到他的實現類

SecurityContextImpl類,可以看出來它只是簡單的通過set get方法封裝了authentication

稍作總結,整理一下上面的思緒:通過認證的請求保存到了SecurityContext,然後在外層是通過SecurityContextHolder調用它的靜態方法獲取到,這樣通過的認證請求信息就可以供其他請求線程來訪問了。SecurityContextHolder相當於ThreadLocal,保持線程需要共享的數據。

 在security框架執行的過程中,首先和最後都需要經過的一個過濾器就是SecurityContextPersistenceFiter

當請求剛進來的時候,SecurityContextPersistenceFilter會首先檢查session裏面有沒有SecurityContext,如果有就拿出來放入到線程裏,如果是空的那就直接過去了,當響應的時候,如果線程裏面有SecurityContext就把它們放入到session裏面。

具體代碼應用也挺簡單的,爲了不把篇幅拉太長,想一篇文章寫完,所以想了解的自己在細細品讀

獲取認證用戶信息

有上面的源碼分析,我們就以及知道了,保存我們認證請求信息的是SecurityContext

可以直接獲取,因爲springmvc會幫我們注入進去的

如果只想要用戶的輸入信息,不需要其他信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章