SecurityContextPersistenceFilter和SecurityContextHolder的作用
SecurityContextPersistenceFilter和SecurityContextHolder的作用
SecurityContextHolder
SecurityContextHolder是Spring Security 中最基本的組件,SecurityContextHolder是一個工具類,只提供一些靜態(tài)方法。這個工具類的目的是用來保存應用程序中當前使用人的安全上下文。
SecurityContext securityContext = SecurityContextHolder.getContext();默認情況下:
- SecurityContextHolder使用了ThreadLocal機制來保存每個使用者的安全上下文。
- 根據(jù)Servlet規(guī)范,一個Servlet request的處理不管經(jīng)歷了多少個Filter,自始至終都由同一個線程來完成。
這意味著,只要針對某個使用者的邏輯執(zhí)行都是在同一個線程中進行,即使不在各個方法之間以參數(shù)的形式傳遞其安全上下文,各個方法也能通過SecurityContextHolder工具獲取到該安全上下文。并且因為SecurityContextHolder使用了ThreadLocal機制來保存每個使用者的安全上下文,所以在一個請求處理的邏輯執(zhí)行中都在同一個線程中進行,而請求對應的安全上下文就保存在SecurityContextHolder中。所以我們才可以通過SecurityContextHolder.getContext();每個請求自己獨立的安全上下文。
需要注意的一點是,這里說的是一次請求,而非一次會話,而如何將請求的信息保存在session中就要看下面的SecurityContextPersistenceFilter的工作原理了。
SecurityContextHolder的其他工作模式
根據(jù)不同的web應用可以有不同的上下文保存和管理方式,而SecurityContextHolder一共提供了三種工作模式,而每一種工作模式就對應著一個一種上下文管理方式。
SecurityContextHolder有以下三種模式:
- MODE_THREADLOCAL (缺省工作模式,也就是默認模式)
- MODE_GLOBAL
- MODE_INHERITABLETHREADLOCAL
MODE_GLOBAL
這個稱之為全局模式,該模式下的JVM中所有的線程使用同一個安全上下文,所以所以請求的線程都是共用一個上下文,而不存在MODE_THREADLOCAL模式中的使用ThreadLocal機制來保存每個使用者的安全上下文。
MODE_INHERITABLETHREADLOCAL
根據(jù)名字可以猜測出這是一個繼承MODE_THREADLOCAL的一種模式,在該模式下,用戶可以自定義自己的線程創(chuàng)建,并且希望這些自定義的新建線程也能使用創(chuàng)建者的安全上下文。
SecurityContextPersistenceFilter
SecurityContextPersistenceFilter其實是spring security中filterchainproxy中的一個Filter,而跨請求安全上下文SecurityContext的保持,是通過SecurityContextPersistenceFilter來實現(xiàn)的,SecurityContextPersistenceFilter將安全上下文SecurityContext對象保存為當前用戶HttpSession對象的一個屬性。
SecurityContextPersistenceFilter除了負責安全上下文的持久化,在一些restful api的非持久化的請求場景中,SecurityContextPersistenceFilter還負責該安全上下文的銷毀。
SecurityContextPersistenceFilter有兩個主要任務:
- 在請求到達時處理之前,從SecurityContextRepository中獲取安全上下文信息填充到SecurityContextHolder;
- 在請求處理結束后返回響應時,將SecurityContextHolder中的安全上下文信息保存回SecurityContextRepository,并清空SecurityContextHolder。
SecurityContextPersistenceFilter的工作過程
對于一些要求跨 request 請求保持的場景,我們都是通過session來保存一次request中的信息,當下次請求過來的時候,我們可以通過session獲取之前請求中的信息。SecurityContextPersistenceFilter這個filter就是處理請求最后的保存操作。
具體來講,操作如下:
- 一個安全上下文在某個請求1處理過程中被創(chuàng)建并記錄到SecurityContextHolder(準確來說是SecurityContextHolder中對應的ThreadLocal);
- 請求1的處理結束時返回響應時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文保存到HttpSession(SecurityContextRepository負責安全上下文的持久);
- 后續(xù)該用戶會話中的另外一個請求2處理過程開始時,SecurityContextPersistenceFilter會將安全上下文從HttpSession恢復到SecurityContextHolder;
- 請求2處理過程結束時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文保存到HttpSession;
- 后續(xù)其他請求的處理過程會重復和上面請求2處理過程中一樣的使用SecurityContextPersistenceFilter重置/恢復SecurityContext的動作。
在現(xiàn)實場景中,處理在一些restful api的非持久化的請求場景中,SecurityContextPersistenceFilter負責安全上下文的銷毀,具體操作如下:
- 一個安全上下文在某個請求1處理過程中被創(chuàng)建并記錄到SecurityContextHolder
- 請求1的處理結束時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文進行銷毀
總結
以上是生活随笔為你收集整理的SecurityContextPersistenceFilter和SecurityContextHolder的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 炒鸡内金粉的功效与作用、禁忌和食用方法
- 下一篇: 生龙牡的功效与作用、禁忌和食用方法
