书 接 上 回、我 们 分 析 下 AuthController.@PostMapping("/login") 接 口 作 为 切 入 点 进 行 深 入 浅 出 剖 析 ~ ~
下 面 我 们 以 小 明 的 authenticateUser 方 法 为 入 口 , 详 细 拆 解 认 证 执 行 的 ** 完 整 流 程 闭 环 ** , 并 深 入 分 析 Authentication authentication = authenticationManager.authenticate(...) 的 ** 调 用 链 路 ** , 同 时 说 明 ** 自 定 义 类 ** 在 其 中 的 作 用 。 代 码 块 中 汉 字 正 常 书 写 , 代 码 块 外 汉 字 间 保 持 2 个 空 格 。
一 、 完 整 认 证 流 程 闭 环
认 证 流 程 从 用 户 提 交 登 录 请 求 开 始 , 到 返 回 JWT 响 应 结 束 , 形 成 如 下 闭 环 :
graph LR A[用户提交登录请求] --> B[接收LoginRequest参数] B --> C[创建UsernamePasswordAuthenticationToken] C --> D[调用AuthenticationManager.authenticate] D --> E[DaoAuthenticationProvider处理认证] E --> F[UserDetailsService查询用户] F --> G[PasswordEncoder验证密码] G --> H[构建认证后Authentication对象] H --> I[设置SecurityContextHolder] I --> J[JwtService生成JWT令牌] 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 、 用 户 名 、 邮 箱 ) 和 权 限 ( 角 色 / 权 限 字 符 串 ) , 代 码 示 例 :
[code]public class UserDetailsImpl implements UserDetails { private Long id; private String username; private String email; private String password; private Collection |