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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 验证与调整 三、典…