轮达 发表于 2025-11-25 18:00:04

Spring Security 认证流程闭环与调用链路详解

书接上回、我们分析下AuthController.@PostMapping("/login")接口作为切入点进行深入浅出剖析~ ~

下面我们以小明的   authenticateUser   方法为入口,详细拆解认证执行的**完整流程闭环**,并深入分析   Authentication authentication = authenticationManager.authenticate(...)   的**调用链路**,同时说明**自定义类**在其中的作用。代码块中汉字正常书写,代码块外汉字间保持2个空格。
一、完整认证流程闭环

认证流程从用户提交登录请求开始,到返回JWT响应结束,形成如下闭环:
graph LR    A[用户提交登录请求] --> B[接收LoginRequest参数]    B --> C[创建UsernamePasswordAuthenticationToken]    C --> D[调用AuthenticationManager.authenticate]    D --> E    E --> F    F --> G    G --> H[构建认证后Authentication对象]    H --> I[设置SecurityContextHolder]    I --> J    J --> K[封装JwtResponse响应]    K --> L[返回响应给用户]      class A,B,C,D,E,F,G,H,I,J,K,L default-class流程闭环详细步骤(结合代码)

1.接收登录请求(自定义DTO入口)

用户通过前端提交用户名和密码,请求体被@RequestBody LoginRequest loginRequest接收。
**自定义类   LoginRequest   作用**:封装登录请求参数(用户名、密码),代码如下:
public class LoginRequest {
    private String username;// 用户名
    private String password;// 密码
    // Getters and Setters
}2.创建认证请求对象(Spring Security自带类)

通过   new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())   创建认证请求对象。
**Spring Security自带类   UsernamePasswordAuthenticationToken   作用**:

[*]来源:   org.springframework.security.authentication.UsernamePasswordAuthenticationToken
[*]作用:封装用户名密码认证请求,初始状态下   authorities   (权限)为空,相当于“未盖章的通行证”。
3.调用   AuthenticationManager.authenticate()   (核心调用链路,下文详解)

将上述   UsernamePasswordAuthenticationToken   传入   authenticationManager.authenticate()   ,触发认证流程。
4.认证成功后设置安全上下文

认证成功返回填充完权限的   Authentication   对象,通过   SecurityContextHolder.getContext().setAuthentication(authentication)   绑定到当前线程。
5.生成JWT令牌(自定义   JwtService   )

调用   jwtService.generateToken(authentication)   生成JWT,用于后续无状态认证。
**自定义类   JwtService   作用**:封装JWT生成/验证逻辑,核心方法   generateToken(Authentication authentication)   从   authentication   中提取用户名、权限等信息,按规则生成签名令牌。
6.封装响应数据(自定义DTO)

从   authentication.getPrincipal()   获取   UserDetailsImpl   (自定义用户详情类),提取用户ID、用户名、邮箱、角色等信息,封装为   JwtResponse   返回。
**自定义类作用**:

[*] UserDetailsImpl   :实现Spring Security的   UserDetails   接口,封装用户基础信息(ID、用户名、邮箱)和权限(角色/权限字符串),代码示例:
public class UserDetailsImpl implements UserDetails {      private Long id;      private String username;      private String email;      private String password;      private Collection

万妙音 发表于 2025-11-27 04:46:32

感谢发布原创作品,程序园因你更精彩

觐有 发表于 2025-12-15 22:17:49

感谢分享,学习下。

鞍注塔 发表于 2025-12-24 20:03:27

东西不错很实用谢谢分享

石娅凉 发表于 2026-1-15 03:46:24

过来提前占个楼

滑清怡 发表于 2026-1-16 11:14:49

前排留名,哈哈哈

昝梓菱 发表于 2026-1-17 21:39:38

前排留名,哈哈哈

轧岔 发表于 2026-1-20 08:56:39

这个好,看起来很实用

粹脍誊 发表于 2026-1-21 06:38:20

新版吗?好像是停更了吧。

晾棋砷 发表于 2026-1-22 12:29:12

前排留名,哈哈哈

钱匾 发表于 2026-1-24 13:54:09

用心讨论,共获提升!

邹弘丽 发表于 2026-1-26 09:42:12

不错,里面软件多更新就更好了

山真柄 发表于 2026-1-26 10:45:03

用心讨论,共获提升!

端木茵茵 发表于 2026-1-28 17:21:44

感谢,下载保存了

端木茵茵 发表于 2026-2-3 09:19:15

yyds。多谢分享

赐度虻 发表于 2026-2-5 10:02:50

懂技术并乐意极积无私分享的人越来越少。珍惜

丘娅楠 发表于 2026-2-8 04:02:37

分享、互助 让互联网精神温暖你我

韩素欣 发表于 2026-2-8 10:32:43

很好很强大我过来先占个楼 待编辑

倘伟 发表于 2026-2-11 02:12:21

谢谢分享,辛苦了

铝缉惹 发表于 2026-2-11 02:14:45

感谢发布原创作品,程序园因你更精彩
页: [1] 2
查看完整版本: Spring Security 认证流程闭环与调用链路详解