AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解

AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解

在 Spring Security 中,AbstractAuthenticationTokenAuthentication 接口的??抽象實現類??,其核心作用是為具體的認證令牌(如用戶名密碼令牌、JWT 令牌等)提供??基礎結構與默認方法??,簡化開發者在實現自定義認證令牌時的重復代碼。它是 Spring Security 認證流程中“認證載體”的核心抽象,連接了認證請求與最終的認證結果。

核心作用詳解

1. ??實現 Authentication 接口的基礎結構??

Authentication 接口定義了認證令牌的核心行為(如獲取主體、權限、認證狀態等)。AbstractAuthenticationToken 實現了該接口,并提供了以下基礎能力:

  • ??管理認證狀態??:通過 isAuthenticated() 判斷是否已認證,setAuthenticated(boolean) 控制認證狀態(部分子類會覆蓋此方法)。
  • ??存儲主體與憑證??:通過 getPrincipal() 獲取用戶主體(如用戶名、用戶對象),getCredentials() 獲取驗證憑證(如密碼、token)。
  • ??權限管理??:通過 getAuthorities() 獲取用戶權限集合(GrantedAuthority),這是授權決策的關鍵依據。
2. ??提供默認方法實現??

AbstractAuthenticationTokenAuthentication 接口的部分方法提供了默認實現,避免子類重復編寫代碼:

方法說明
getAuthorities()默認返回空集合(Collections.emptyList()),子類需重寫以提供具體權限。
isAuthenticated()默認返回 false(未認證狀態),子類可根據實際情況調整(如 UsernamePasswordAuthenticationToken 由認證流程設置)。
eraseCredentials()默認清空憑證(setCredentials(null)),子類可重寫以自定義清理邏輯(如保留必要信息)。
3. ??定義認證令牌的通用行為??

AbstractAuthenticationToken 明確了認證令牌的??生命周期規范??,例如:

  • ??未認證狀態??:初始時(如用戶提交表單前),令牌處于未認證狀態(isAuthenticated() == false)。
  • ??認證后狀態??:通過 setAuthenticated(true) 標記為已認證(通常由 AuthenticationManager 完成)。
  • ??憑證安全??:通過 eraseCredentials() 清理敏感信息(如密碼),防止內存泄漏導致的安全風險。

關鍵子類與典型場景

1. ??UsernamePasswordAuthenticationToken(最常用)??

用于??表單登錄或 HTTP 基本認證??,表示“用戶名+密碼”的認證請求或結果。

??使用示例??:

// 認證請求階段(未認證)
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken("username",  // principal(用戶主體)"password"   // credentials(密碼憑證)
);// 認證成功后(已認證,包含權限)
Authentication authenticatedToken = new UsernamePasswordAuthenticationToken(user,        // principal(用戶對象)null,        // 憑證已清理(eraseCredentials())authorities  // 權限集合(如 ROLE_USER)
);
2. ??JwtAuthenticationToken(JWT 場景)??

用于??JWT 令牌認證??,表示通過 JWT 令牌完成的認證。

??自定義示例??:

public class JwtAuthenticationToken extends AbstractAuthenticationToken {private final String token; // JWT 令牌字符串private UserDetails userDetails; // 解析后的用戶詳情// 構造未認證的 JWT 令牌(僅包含令牌字符串)public JwtAuthenticationToken(String token) {super(null); // 初始權限為空this.token = token;setAuthenticated(false); // 未認證}// 構造已認證的 JWT 令牌(包含用戶詳情和權限)public JwtAuthenticationToken(UserDetails userDetails, Collection<? extends GrantedAuthority> authorities) {super(authorities);this.userDetails = userDetails;this.token = null; // 認證后無需保留原始令牌(可選)setAuthenticated(true); // 標記為已認證}@Overridepublic Object getPrincipal() {return userDetails != null ? userDetails.getUsername() : token;}@Overridepublic Object getCredentials() {return token; // 憑證是 JWT 令牌本身(認證后可能被清理)}@Overridepublic void eraseCredentials() {super.eraseCredentials();this.token = null; // 清理令牌(可選)}
}
3. ??AnonymousAuthenticationToken(匿名用戶場景)??

用于??未登錄用戶的匿名訪問??,表示一個“匿名主體”(如訪客用戶)。

??特點??:

  • 認證狀態為 true(視為已認證,但權限受限)。
  • 主體通常是 AnonymousAuthenticationToken 自身的實例。

核心方法與設計細節

1. ??構造方法??

AbstractAuthenticationToken 提供了兩個構造方法:

// 構造未認證的令牌(權限集合由參數指定)
public AbstractAuthenticationToken(Collection<? extends GrantedAuthority> authorities) {this.authorities = Collections.unmodifiableList(new ArrayList<>(authorities));
}// 構造已認證的令牌(權限集合由參數指定)
protected AbstractAuthenticationToken(Collection<? extends GrantedAuthority> authorities, Object principal, Object credentials) {this.authorities = authorities;this.principal = principal;this.credentials = credentials;setAuthenticated(true);
}
  • 子類通常根據場景選擇構造方法(如 UsernamePasswordAuthenticationToken 在認證前使用無權限構造,認證后使用帶權限構造)。
2. ??setAuthenticated(boolean) 的限制??

默認情況下,AbstractAuthenticationTokensetAuthenticated(boolean) 方法會拋出 IllegalArgumentException,因為??部分令牌的認證狀態應由 Spring Security 自動管理??(如 UsernamePasswordAuthenticationToken)。

??示例(UsernamePasswordAuthenticationToken 的實現)??:

@Override
public void setAuthenticated(boolean isAuthenticated) {if (isAuthenticated) {throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");}super.setAuthenticated(false);
}
  • 若需手動設置認證狀態(如自定義令牌),需覆蓋此方法(如 AnonymousAuthenticationToken)。
3. ??eraseCredentials() 的安全實踐??

AbstractAuthenticationToken 要求子類在認證完成后清理敏感憑證(如密碼),防止內存泄漏導致的信息泄露。典型實現:

@Override
public void eraseCredentials() {super.eraseCredentials();this.credentials = null; // 清空憑證字段
}

Authentication 接口的關系

  • Authentication 是接口,定義了認證令牌的行為規范(如獲取主體、權限、認證狀態)。
  • AbstractAuthenticationToken 是其抽象實現,提供了基礎結構與默認方法,降低了自定義令牌的實現成本。

總結

AbstractAuthenticationToken 是 Spring Security 認證流程中??認證令牌的核心抽象類??,通過提供基礎結構、默認方法和安全規范,簡化了具體認證令牌(如 UsernamePasswordAuthenticationTokenJwtAuthenticationToken)的實現。它確保了認證令牌的一致性,是連接“認證請求”與“認證結果”的關鍵橋梁,也是開發者自定義認證邏輯的重要基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91267.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序視頻播放,與父視圖一致等樣式設置

初始設置的代碼&#xff1a;WXML的代碼<view class"card-wrapper"> <!-- 視頻播放容器&#xff08;默認隱藏&#xff09; --> <view class"video-container" wx:if"{{isPlaying}}"> <video id"cardVideo" class&…

Kafka——關于主題管理

引言在Kafka的世界中&#xff0c;主題&#xff08;Topic&#xff09;是消息的基本組織單位&#xff0c;類似于文件系統中的"文件夾"——所有消息都按照主題分類存儲&#xff0c;生產者向主題寫入消息&#xff0c;消費者從主題讀取消息。主題的管理是Kafka運維的基礎&…

【VLLM】VLLM使用

一 、安裝 二、啟動入口 VLLM 提供了多種入口方式啟動模型&#xff0c;以適應不同的使用場景&#xff08;如命令行交互、API 服務、自定義集成等&#xff09;。除了最常用的 openai.api_server&#xff08;OpenAI 兼容 API 服務&#xff09;&#xff0c;還有以下主要入口&#…

為Github Copilot創建自定義指令/說明/注意事項

GitHub Copilot 是一個強大的 AI 編程助手&#xff0c;通過合理配置自定義指令&#xff0c;可以讓它更好地理解和遵循項目特定的編碼規范&#xff0c;省的每次提問時輸入重復提示語。 目錄 方法一&#xff1a;項目級別指令文件&#xff08;推薦&#xff09;方法二&#xff1a…

信創厚知聯盟會長兼創始人蒞臨綠算技術

2025年7月29日&#xff0c;信創厚知聯盟會長兼創始人王杲一行考察廣東省綠算技術有限公司&#xff0c;重點調研其在智算中心存儲與AI算力協同領域的創新成果。此次交流標志著雙方在信創產業生態合作上邁出重要一步&#xff0c;為國產高端高性能全閃存存儲與智算基礎設施的融合發…

RAG面試內容整理-Prompt Engineering 在 RAG 中的作用

Prompt Engineering(提示工程)指為生成模型精心設計輸入提示,以引導模型產生所需的輸出。在RAG系統中,prompt設計對充分利用檢索到的知識至關重要。因為生成器(通常是LLM)接收到的不僅有用戶問題,還有檢索的文檔內容,我們需要通過提示明確告訴模型如何使用這些信息。例…

【計算機網絡】5傳輸層

傳輸層是面向通信的最高層&#xff0c;也是用戶功能的最底層。 傳輸層僅存在于主機中&#xff0c;路由器等中間設備只用到下三層&#xff08;無傳輸層&#xff09;。傳輸層對上層應用隱藏了底層網絡的復雜細節&#xff08;比如數據怎么路由、網絡怎么連接等&#xff09;。對應用…

SecureCRT連接密鑰交換失敗

SecureCRT連接密鑰交換失敗問題描述&#xff1a;問題分析&#xff1a;解決方案&#xff1a;問題描述&#xff1a; SecureCRT6.7連接銀河麒麟操作系統v10版本&#xff0c;報錯如下&#xff1a; key exchange failed 密鑰交換失敗 no compatible key exchange method. The serv…

2021-05-10 求出這十個數據的平均值,并輸入高于平均值的所有元素值及下標求出這十個數據的平均值,并輸入高于平均值的所有元素值及下標

緣由C語言向一維數組a[10]中輸入10個數據&#xff1a;12&#xff0c;15&#xff0c;18&#xff0c;21&#xff0c;24&#xff0c;32&#xff0c;34&#xff0c;36&#xff0c;38&#xff0c;4-其他-CSDN問答 double a[10000]{}, j 0; int n 0;while (n < 10000){std::cin …

WordPress與主流CMS拿Webshell實戰

一、wordpress安裝環境首先我們在vulhub中啟動我們wordpress的doaker容器然后去訪問我們的80端口然后選擇簡體中文進行安裝然后就可以登錄到我們的后臺界面了后臺修改模板拿webshell進入后臺&#xff0c;我們修改一下404頁面的代碼&#xff0c;添加我們的一句話木馬然后保存&am…

指針的運算與數組

一、指針的運算1.1加法對指針可以進行加法運算&#xff0c;即p n或者p - n。其結果依舊是一個是一個指針&#xff0c;新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型)&#xff09;個字節。 指針也可以進行自增&#xff0c;即*&#xff08;p &#xf…

【PostgreSQL內核學習:WindowAgg 幀優化與節點去重】

PostgreSQL內核學習&#xff1a;WindowAgg 幀優化與節點去重背景關鍵詞解釋本優化主要修改內容描述提交信息提交描述源碼解讀optimize_window_clauses 函數核心邏輯拆解函數時序圖新增結構體類型 SupportRequestOptimizeWindowClause優化后的效果幀優化 sql 用例查詢計劃輸出節…

行業要聞|正式落地!新思科技宣布完成對Ansys的收購

2025年7月17日——新思科技&#xff08;Synopsys, Inc.&#xff0c;納斯達克股票代碼&#xff1a;SNPS&#xff09;宣布完成對Ansys的收購。該交易旨在整合芯片設計、IP核以及仿真與分析領域的領先企業&#xff0c;助力開發者快速創新AI驅動的產品。在擴大至310億美元的總潛在市…

Elasticsearch 基礎速成 5 步跑通索引、文檔、映射與查詢

1 準備工作運行環境 curl -fsSL https://elastic.co/start-local | sh # 一條命令拉起本地單節點集群 # 瀏覽器打開 http://localhost:5601 進入 Kibana → DevTools → Console已有云端或 Serverless 集群可以直接跳到第 2 步。操作界面 以下所有請求均可在 Kibana → DevT…

語音表示學習論文總結

語音表示學習&#xff08;Speech Representation Learning&#xff09;是語音信號處理與機器學習交叉領域的核心技術&#xff0c;其目標是通過數據驅動的方式&#xff0c;從原始語音信號中自動提取具有判別性、魯棒性和泛化能力的特征表示&#xff0c;以替代傳統手工設計的聲學…

國產芯+單北斗防爆終端:W5-D防爆智能手機,助力工業安全通信升級

在石油石化、煤礦開采、電力檢修等高危行業&#xff0c;防爆設備的定位精度、通信可靠性及供應鏈安全性直接決定作業安全與生產效率。傳統防爆手機依賴GPS定位與進口芯片&#xff0c;存在信號盲區、數據泄露風險及斷供隱患。針對此&#xff0c;我們推出W5-D防爆智能終端&#x…

Kafka簡述及學習課程

Kafka是由Apache軟件基金會開發的一個開源流處理平臺&#xff0c;由Scala和Java編寫。Kafka是一種高吞吐量的分布式發布訂閱消息系統&#xff0c;它可以處理消費者在網站中的所有動作流數據。 這種動作&#xff08;網頁瀏覽&#xff0c;搜索和其他用戶的行動&#xff09;是在現…

BLE PHY 幀結構

BLE&#xff08;低功耗藍牙&#xff09;的 PHY&#xff08;物理層&#xff09;幀結構根據傳輸模式&#xff08;廣播、數據&#xff09;和 PHY 類型&#xff08;1M、2M、Coded PHY&#xff09;有所差異&#xff0c;但基本框架一致。以下是 BLE PHY 幀的通用結構及各部分含義&…

海外貨運 app 系統架構分析

一、引言海外貨運業務涉及眾多復雜環節&#xff0c;從貨物攬收、倉儲管理、運輸調度到最后交付&#xff0c;需要一個高效、穩定且功能全面的 APP 系統來協調各方資源&#xff0c;提升物流效率&#xff0c;保障貨物安全準確送達。本文將對海外貨運 APP 系統架構進行詳細剖析&…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-52,(知識點:簡單一階低通濾波器的設計,RC濾波電路,截止頻率)

目錄 1、題目 2、解答 3、相關知識點 一、一階低通濾波器的核心原理 1. 電路結構 2. 關鍵特性參數 二、一階低通濾波器的設計步驟&#xff08;以 RC 電路為例&#xff09; 1. 確定截止頻率\(f_c\) 2. 選擇電阻 R 的阻值 3. 計算電容 C 的容值 4. 驗證與調整 三、典…