"小崔发现系统登录校验代码散落在三个 Controller 里,密码还是明文比对。白歌说:'Spring Security 的认证流程用标准化接口把登录这件事彻底管起来了。'这一章,你将从用户提交凭据到身份确认入库,拆解认证流程的每一颗螺丝。"
章节导读:认证
本章定位
本章解决的核心问题:Spring Security 如何从用户提交凭据(用户名/密码)到确认身份并将其存入上下文的完整认证链路。 涵盖认证接口体系、密码策略、表单登录实现,以及 SecurityContext 的线程级存储机制。
学习路线图
学习顺序说明:先建立认证全流程骨架(从请求到入库)→ 逐一拆解核心接口:Authentication(凭证载体)、AuthenticationManager(认证入口)、ProviderManager(委托分发)、DaoAuthenticationProvider(DAO 认证实现)→ 掌握用户数据层:UserDetailsService(用户查询)、UserDetails(用户领域对象)→ 理解密码策略:PasswordEncoder 接口、BCryptPasswordEncoder 实现、DelegatingPasswordEncoder 多算法兼容 → 最后掌握凭证载体与上下文存储:UsernamePasswordAuthenticationToken、SecurityContextHolder、SecurityContext。表单登录作为完整实战收尾。
文件关系说明
| 文件 | 一句话角色 |
|---|---|
认证流程.md | 认证全流程骨架:从用户提交凭据到 SecurityContext 入库的完整链路。 |
Authentication.md | 认证接口:凭证的统一抽象,包含 Principal、Credentials、Authorities 三大核心属性。 |
AuthenticationManager.md | 认证入口:只有一个 authenticate() 方法,是认证请求的统一门面。 |
ProviderManager.md | 委托分发:维护多个 AuthenticationProvider 列表,按顺序尝试认证。 |
DaoAuthenticationProvider.md | DAO 认证实现:从数据库加载用户、比对密码、组装权限的标准流程。 |
UserDetailsService.md | 用户查询接口:根据用户名从数据库加载用户信息的契约。 |
UserDetails.md | 用户领域对象:封装用户名、密码、权限、过期状态等核心属性。 |
PasswordEncoder.md | 密码编码接口:统一密码比对策略(encode/matches/upgradeEncoding)。 |
BCryptPasswordEncoder.md | BCrypt 实现:自适应慢哈希算法,自动加盐,防御彩虹表攻击。 |
DelegatingPasswordEncoder.md | 多算法兼容:前缀识别({bcrypt}、{noop}),支持平滑迁移旧密码。 |
UsernamePasswordAuthenticationToken.md | 凭证载体:封装用户名密码的未认证/已认证两种状态。 |
SecurityContextHolder.md | 上下文存储:ThreadLocal 策略将认证信息绑定到当前线程。 |
SecurityContext.md | 上下文对象:封装 Authentication 的轻量级容器。 |
表单登录.md | 完整实战:UsernamePasswordAuthenticationFilter 的配置、自定义登录页、登录成功/失败处理。 |
知识图谱
核心逻辑:认证流程是一个流水线:UsernamePasswordAuthenticationFilter 从请求中提取用户名密码 → 封装为 UsernamePasswordAuthenticationToken(未认证状态)→ 提交给 AuthenticationManager → ProviderManager 委托给 DaoAuthenticationProvider → 通过 UserDetailsService 从数据库加载用户信息 → PasswordEncoder 比对密码 → 成功则生成已认证 Token → 存入 SecurityContextHolder(ThreadLocal)→ 后续请求从 SecurityContext 中复用身份。BCryptPasswordEncoder 负责安全地存储密码,DelegatingPasswordEncoder 负责兼容旧密码格式。
与上下章的衔接
上一章回顾:你建立了安全过滤器链的宏观骨架,知道请求在到达 Controller 之前会经过一系列安全过滤器。本章深入其中最关键的认证环节——过滤器链中的 UsernamePasswordAuthenticationFilter 如何触发整个认证流水线。
下一章预告:身份确认后,系统需要回答"你能做什么"。下一章「授权」将拆解 AccessDecisionManager、AccessDecisionVoter 等授权决策组件,以及 URL 级、方法级、实例级三层授权模型。