springsecurity认证总结

Spring Security 登录认证整体流程

以下是 Spring Security 登录认证流程的完整步骤,包括所有核心组件的参与和它们的作用:


1. 用户请求登录

  • 用户通过浏览器发送 登录请求,通常为 POST /login,并在请求体中携带用户名和密码。
  • 请求会被 Spring Security 拦截器链中的过滤器捕获,默认处理登录的过滤器是 UsernamePasswordAuthenticationFilter

2. 进入 UsernamePasswordAuthenticationFilter

  • 主要方法:attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
    • 从请求中提取用户提交的用户名和密码。
    • 封装为一个未认证的 Authentication 对象(UsernamePasswordAuthenticationToken)。
    • 调用 AuthenticationManagerauthenticate(Authentication authentication) 方法,开始正式认证流程。

3. 进入 AuthenticationManager

  • AuthenticationManager 是认证的统一入口,负责协调认证的具体实现。
    • 默认实现:ProviderManager
    • ProviderManager 会遍历其内部维护的多个 AuthenticationProvider,找到能处理当前认证的 AuthenticationProvider

4. 进入 AuthenticationProvider

  • 默认的 AuthenticationProviderDaoAuthenticationProvider
    • 核心方法:authenticate(Authentication authentication)
    • 验证逻辑:
      1. 校验 Authentication 的类型是否支持(这里是 UsernamePasswordAuthenticationToken)。
      2. Authentication 对象中提取用户名。
      3. 调用 UserDetailsService 查询用户信息。

5. 调用 UserDetailsService 查询用户信息

  • UserDetailsService
    • 根据用户名从数据库中加载用户信息。
    • 返回一个 UserDetails 对象,包含用户的基本信息(用户名、加密密码、权限等)。
  • 校验点
    • 如果用户不存在,抛出 UsernameNotFoundException
    • 如果加载的用户信息为空,抛出 InternalAuthenticationServiceException

6. 校验密码

  • DaoAuthenticationProvider 中调用 additionalAuthenticationChecks 方法:
    1. Authentication 中提取用户提交的明文密码。
    2. UserDetails 中获取数据库中存储的加密密码。
    3. 使用 PasswordEncoder 比对明文密码和加密密码:
      • 明文密码加密后,和数据库中的加密密码进行比较。
      • 如果比对失败,抛出 BadCredentialsException
      • 如果比对成功,说明用户提交的密码正确。

7. 认证成功处理

  • 如果认证成功:
    • 调用 createSuccessAuthentication 方法创建一个新的 已认证的 Authentication 对象
    • 包含:
      • 用户信息(principal)。
      • 权限信息(GrantedAuthority)。
      • 其他附加信息(details)。
    • 返回认证成功的 Authentication 对象。

8. 认证成功后的处理

  • SecurityContextHolder
    • 将认证成功的 Authentication 对象存入全局的 SecurityContextHolder 中。
    • 这样后续的请求处理可以通过 SecurityContextHolder 获取当前用户的信息。
  • 跳转或返回响应
    • 如果认证成功,跳转到登录成功页面或返回成功响应。
    • 如果认证失败,返回失败响应。

核心组件总结

1. 用户提交信息的载体

  • UsernamePasswordAuthenticationToken
    • 提交时:未认证(只有用户名和密码)。
    • 认证成功后:已认证(包含用户信息、权限等)。

2. 认证管理器

  • AuthenticationManager
    • 负责统一调度认证逻辑。
    • 默认实现是 ProviderManager

3. 认证提供者

  • AuthenticationProvider
    • 负责具体的认证逻辑。
    • 默认实现是 DaoAuthenticationProvider,结合 UserDetailsServicePasswordEncoder 实现用户名和密码校验。

4. 用户数据加载器

  • UserDetailsService
    • 用于从数据库或其他数据源中加载用户信息,返回 UserDetails 对象。

5. 密码加密器

  • PasswordEncoder
    • 用于加密和校验用户密码。

6. 安全上下文

  • SecurityContextHolder
    • 存储认证成功的 Authentication 对象,作为后续请求的安全上下文。

登录流程简图

rust
用户提交登录请求 ↓ UsernamePasswordAuthenticationFilter ↓ AuthenticationManager (ProviderManager) ↓ AuthenticationProvider (DaoAuthenticationProvider) ↓ UserDetailsService 加载用户信息 ↓ PasswordEncoder 校验密码 ↓ 认证成功 -> 保存到 SecurityContextHolder -> 返回成功响应 ↓ 认证失败 -> 返回失败响应

详细流程关键点

  1. 用户提交信息被封装为 UsernamePasswordAuthenticationToken
  2. AuthenticationManager 调用具体的 AuthenticationProvider
  3. UserDetailsService 加载用户信息。
  4. PasswordEncoder 比对密码。
  5. 认证成功后,Authentication 对象被存入 SecurityContextHolder
posted @   langpo  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2023-01-12 并发修改问题
点击右上角即可分享
微信分享提示