Userprincipal是否從SecurityContextHolder
檢索綁定到請求或會話?Spring安全性的SecurityContextHolder:會話或請求綁定?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
這是我訪問當前登錄的用戶的方式。如果當前會話被銷燬,這會失效嗎?
Userprincipal是否從SecurityContextHolder
檢索綁定到請求或會話?Spring安全性的SecurityContextHolder:會話或請求綁定?
UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
這是我訪問當前登錄的用戶的方式。如果當前會話被銷燬,這會失效嗎?
這取決於你如何配置它(或者說,你可以配置一個不同的行爲)。
在Web應用程序中,您將使用與SecurityContextPersistenceFilter
交互的ThreadLocalSecurityContextHolderStrategy
。
該爪哇SecurityContextPersistenceFilter
開始於文檔:
填充{@link SecurityContextHolder中}與來自配置的 獲得 信息{@link SecurityContextRepository}之前 請求並將其存儲回 存儲庫一旦請求已完成 並清除上下文 持有者。默認情況下,它使用{@link HttpSessionSecurityContextRepository}。 查看此類信息 HttpSession相關 配置選項。
BTW:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一實現(我已經在默認庫中找到)
它的工作原理是這樣的:
HttpSessionSecurityContextRepository
使用HttpSession中(關鍵=」 SPRING_SECURITY_CONTEXT「)來存儲一個SecurityContext
對象。SecurityContextPersistenceFilter
是一個過濾器,它使用SecurityContextRepository
例如HttpSessionSecurityContextRepository
加載和存儲SecurityContext
對象。如果一個HttpRequest通過過濾器,過濾器獲取從存儲庫中SecurityContext
,並把它放在SecurityContextHolder裏(SecurityContextHolder#setContext
)SecurityContextHolder
有兩個方法setContext
和getContext
。兩者都使用SecurityContextHolderStrategy
來指定在set-和get-Context方法中完成了什麼。 - 例如,ThreadLocalSecurityContextHolderStrategy
使用本地線程來存儲上下文。所以總結:用戶主體(SecurityContext的元素)存儲在HTTP會話中。並且對於每個請求,它都會放入您訪問它的本地線程中。