目錄
認證流程源碼級詳解
認證結果如何在多個請求之間共享
也就是分析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會幫我們注入進去的
如果只想要用戶的輸入信息,不需要其他信息