日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SecurityContextPersistenceFilter和SecurityContextHolder的作用

發布時間:2024/9/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SecurityContextPersistenceFilter和SecurityContextHolder的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SecurityContextPersistenceFilter和SecurityContextHolder的作用

SecurityContextHolder

SecurityContextHolder是Spring Security 中最基本的組件,SecurityContextHolder是一個工具類,只提供一些靜態方法。這個工具類的目的是用來保存應用程序中當前使用人的安全上下文。

SecurityContext securityContext = SecurityContextHolder.getContext();

默認情況下:

  • SecurityContextHolder使用了ThreadLocal機制來保存每個使用者的安全上下文。
  • 根據Servlet規范,一個Servlet request的處理不管經歷了多少個Filter,自始至終都由同一個線程來完成。

這意味著,只要針對某個使用者的邏輯執行都是在同一個線程中進行,即使不在各個方法之間以參數的形式傳遞其安全上下文,各個方法也能通過SecurityContextHolder工具獲取到該安全上下文。并且因為SecurityContextHolder使用了ThreadLocal機制來保存每個使用者的安全上下文,所以在一個請求處理的邏輯執行中都在同一個線程中進行,而請求對應的安全上下文就保存在SecurityContextHolder中。所以我們才可以通過SecurityContextHolder.getContext();每個請求自己獨立的安全上下文。

需要注意的一點是,這里說的是一次請求,而非一次會話,而如何將請求的信息保存在session中就要看下面的SecurityContextPersistenceFilter的工作原理了。

SecurityContextHolder的其他工作模式

根據不同的web應用可以有不同的上下文保存和管理方式,而SecurityContextHolder一共提供了三種工作模式,而每一種工作模式就對應著一個一種上下文管理方式。

SecurityContextHolder有以下三種模式:

  • MODE_THREADLOCAL (缺省工作模式,也就是默認模式)
  • MODE_GLOBAL
  • MODE_INHERITABLETHREADLOCAL
MODE_GLOBAL

這個稱之為全局模式,該模式下的JVM中所有的線程使用同一個安全上下文,所以所以請求的線程都是共用一個上下文,而不存在MODE_THREADLOCAL模式中的使用ThreadLocal機制來保存每個使用者的安全上下文。

MODE_INHERITABLETHREADLOCAL

根據名字可以猜測出這是一個繼承MODE_THREADLOCAL的一種模式,在該模式下,用戶可以自定義自己的線程創建,并且希望這些自定義的新建線程也能使用創建者的安全上下文。

SecurityContextPersistenceFilter

SecurityContextPersistenceFilter其實是spring security中filterchainproxy中的一個Filter,而跨請求安全上下文SecurityContext的保持,是通過SecurityContextPersistenceFilter來實現的,SecurityContextPersistenceFilter將安全上下文SecurityContext對象保存為當前用戶HttpSession對象的一個屬性。

SecurityContextPersistenceFilter除了負責安全上下文的持久化,在一些restful api的非持久化的請求場景中,SecurityContextPersistenceFilter還負責該安全上下文的銷毀。

SecurityContextPersistenceFilter有兩個主要任務:

  • 在請求到達時處理之前,從SecurityContextRepository中獲取安全上下文信息填充到SecurityContextHolder;
  • 在請求處理結束后返回響應時,將SecurityContextHolder中的安全上下文信息保存回SecurityContextRepository,并清空SecurityContextHolder。

SecurityContextPersistenceFilter的工作過程

對于一些要求跨 request 請求保持的場景,我們都是通過session來保存一次request中的信息,當下次請求過來的時候,我們可以通過session獲取之前請求中的信息。SecurityContextPersistenceFilter這個filter就是處理請求最后的保存操作。

具體來講,操作如下:

  • 一個安全上下文在某個請求1處理過程中被創建并記錄到SecurityContextHolder(準確來說是SecurityContextHolder中對應的ThreadLocal);
  • 請求1的處理結束時返回響應時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文保存到HttpSession(SecurityContextRepository負責安全上下文的持久);
  • 后續該用戶會話中的另外一個請求2處理過程開始時,SecurityContextPersistenceFilter會將安全上下文從HttpSession恢復到SecurityContextHolder;
  • 請求2處理過程結束時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文保存到HttpSession;
  • 后續其他請求的處理過程會重復和上面請求2處理過程中一樣的使用SecurityContextPersistenceFilter重置/恢復SecurityContext的動作。

在現實場景中,處理在一些restful api的非持久化的請求場景中,SecurityContextPersistenceFilter負責安全上下文的銷毀,具體操作如下:

  • 一個安全上下文在某個請求1處理過程中被創建并記錄到SecurityContextHolder
  • 請求1的處理結束時,SecurityContextPersistenceFilter會將SecurityContextHolder中的安全上下文進行銷毀

總結

以上是生活随笔為你收集整理的SecurityContextPersistenceFilter和SecurityContextHolder的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。