SecurityContextHolder解析

作用:保留系統當前的安全上下文細節,其中就包括當前使用系統的用戶信息。
每個用戶都有自己的SecurityContext,存儲在一個SecurityContextHolder中,整個應用就一個SecurityContextHolder。

SecurityContextHolder存儲SecurityContext的方式:
1 單機系統:應用從開啓到關閉的整個生命週期只有一個用戶在使用。由於整個應用只需要保存一個SecurityContext(安全上下文即可)。
2 多用戶系統,比如典型的Web系統,整個生命週期可能同時有多個用戶在使用。這時候應用需要保存多個SecurityContext(安全上下文),需要利用ThreadLocal進行保存,每個線程都可以利用ThreadLocal獲取其自己的SecurityContext,及安全上下文。

SecurityContextHolder
在這裏插入圖片描述
SecurityContextHolder利用了一個SecurityContextHolderStrategy(存儲策略)進行上下文的存儲。
SecurityContestHolderStrategy.java
在這裏插入圖片描述
SecurityContextHolderStrategy只是一個接口,這個接口提供創建,清空,獲取,設置上下文的操作。以下是其實現類和存儲策略。
在這裏插入圖片描述

GlobalSecurityContextHolderStrategy(全部源碼)
全局的上下文存取策略,只存儲一個上下文,對應前面說的單機系統。
ThreadLocalSecurityContextHolderStrategy基於ThreadLocal的存儲策略的實現,ThreadLocal實際上用數組存儲多個SecurityCentext上下文對象。原理是,ThreadLocal會爲每個線程開闢一個存儲區域,來存儲相應的對象。

Authentication:用戶信息的表示,SecurityContextHolder存儲了當前與系統交互的用戶信息。Principal(準則)=> 允許通過的規則,即允許訪問的規則,基本等價於UserDetails(用戶信息)。SecurityContext只保存了Authentication的信息。
在這裏插入圖片描述
在這裏插入圖片描述

Authenticatioin中包含了如下信息:
Authorities用戶權限集合:可用於訪問受保護資源時的權限驗證
Credentials:證明委託人的憑據是正確的。這通常是一個密碼,但可以是與Authentication Manager相關的任何內容。調用者被期望填充憑證。
Details細節:存儲有關身份驗證請求的其他詳細信息。這些可能是ip地址、證書序列號等。
Pirncipal:被認證主體的身份。對於具有用戶名和密碼的authentication request,這就是用戶名。調用者將填充身份驗證請求的主體。Authentication Manager實現通常會返回一個包含豐富信息的身份驗證,作爲應用程序使用的主體。許多身份驗證提供者將創建一個UserDetails對象作爲主體。
isAuthenticated:是否已認證成功。

參考:
https://www.cnblogs.com/longfurcat/p/9417912.html

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