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 感谢发布原创作品,程序园因你更精彩 感谢分享,学习下。 东西不错很实用谢谢分享 过来提前占个楼 前排留名,哈哈哈 前排留名,哈哈哈 这个好,看起来很实用 新版吗?好像是停更了吧。 前排留名,哈哈哈 用心讨论,共获提升! 不错,里面软件多更新就更好了 用心讨论,共获提升! 感谢,下载保存了 yyds。多谢分享 懂技术并乐意极积无私分享的人越来越少。珍惜 分享、互助 让互联网精神温暖你我 很好很强大我过来先占个楼 待编辑 谢谢分享,辛苦了 感谢发布原创作品,程序园因你更精彩
页:
[1]
2