首页 > 其他分享 >springsecurity认证总结

springsecurity认证总结

时间:2025-01-12 17:03:17浏览次数:1  
标签:总结 UserDetailsService 用户 认证 密码 Authentication springsecurity AuthenticationProvi

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

标签:总结,UserDetailsService,用户,认证,密码,Authentication,springsecurity,AuthenticationProvi
From: https://www.cnblogs.com/zyb-luckey/p/18667064

相关文章

  • dp总结(未完)
    动态规划对于一个能用动态规划解决的问题,一般采用如下思路解决:1.将原问题划分为若干阶段,每个阶段对应若干个子问题,提取这些子问题的特征(称之为状态);2.寻找每一个状态的可能决策,或者说是各状态间的相互转移方式(用数学的语言描述就是状态转移方程)。3.按顺序求解每一个阶段的......
  • 数据分析之年度总结分享
    背景:我们是一家国内的服装公司,在全国拥有几十家服装门店,从事18个服装品类的销售,市场覆盖国内上海、华北、华中、西南、东北、中南、西北七个区域,年销售额达数千万元。财年结束了,老板希望我们(数据分析师)能对公司的销售团队的数据进行分析,并得出结论作为下年度的制定作战的......
  • SAP系统PP生产计划模块业务调研总结报告框架
    文章目录前言业务调研总结报告前言进行业务调研要做到全面、细致、深入,把握业务背景、痛点和需求,才能为后续的专题讨论、蓝图设计及系统实施、测试打下良好的基础。以下为SAP项目PP模块的业务调研总结报告框架示意,供参考。业务调研总结报告一、文档目的二、关......
  • 26个开源Agent开发框架调研总结(1)
    根据Markets&Markets的预测,到2030年,AIAgent的市场规模将从2024年的50亿美元激增至470亿美元,年均复合增长率为44.8%。Gartner预计到2028年,至少15%的日常工作决策将由AIAgent自主完成,AIAgent在企业应用中的重要性正在飞速上升。可以预见,今后几年AIAgent的应用开发还将继......
  • LeetCode题练习与总结:复数乘法--537
    一、题目描述复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件:实部 是一个整数,取值范围是 [-100,100]虚部 也是一个整数,取值范围是 [-100,100]i^2==-1给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。......
  • 代码随想录训练营第四十五天| 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑
    115.不同的子序列题目链接:115.不同的子序列-力扣(LeetCode)讲解链接:代码随想录 hard确实不好直接说出来粘一下思路:(引自代码随想录)确定dp数组(dptable)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。为什么i-1,j-1这么定义卡哥......
  • python基础篇总结:数据类型
    在python中数据类型主要是以下9种分别是1.Int(整型);2.Float(浮点型);3.Bool(布尔型);4.Str(字符串);5.None(空值);6.List(列表);7.Tuple(元组);8.Dict(字典);9.Set(集合)等一.Int(整数)整数是Python中最基本的数值类型,用于表示整数值。1.定义整数变量:2.使用内置函数处理整数:3.进行算术运......
  • CDA证书一级必备知识点【教材精华总结】
    博主已通过CDA数据分析师一级考试,下面是来自红色封皮官方教材中必须要掌握的知识点(个人认为)。最好记住每一个概念都是什么意思,每个分类大类下面都包含哪些小类,尤其是分辨每种图表的用途,每个分析方法的适用场景,真题考了好几个。1、表格结构的数据类型:数值、文本、逻辑2、B......
  • 我的2024(非常年终总结)
    年年总年年结年年刻板与雷同,今年松今年垮今年义在字外意不言中。(笔记模板由python脚本于2025年01月07日19:45:46创建,本篇笔记适合任何的coder翻阅)【学习的细节是欢悦的历程】Python官网:https://www.python.org/Free:大咖免费“圣经”教程《python完全自学教......
  • 代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面
    一、刷题部分1.124.两两交换链表中的节点原文链接:代码随想录题目链接:24.两两交换链表中的节点-力扣(LeetCode)1.1.1题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输......