spring security 认证流程分析

Spring Security 认证流程分析

Spring Security 的认证流程是一个模块化且可扩展的过程,核心围绕 过滤器链认证组件 协作实现。以下是详细流程分析:


1. 请求拦截与过滤器链

入口:所有 HTTP 请求经过 Spring Security 的过滤器链。
关键过滤器
SecurityContextPersistenceFilter:从存储(如 Session)加载或初始化 SecurityContext
UsernamePasswordAuthenticationFilter:处理表单登录请求,提取用户名密码。
OAuth2LoginAuthenticationFilter:处理 OAuth2 第三方登录流程。
AnonymousAuthenticationFilter:为未认证用户赋予匿名身份(默认角色 ROLE_ANONYMOUS)。


2. 认证信息提取与封装

认证方式:根据请求类型(表单、OAuth2、HTTP Basic 等)提取凭证。
创建 Authentication 对象

// 示例:表单登录创建 UsernamePasswordAuthenticationToken
Authentication authRequest = new UsernamePasswordAuthenticationToken(username, password);

3. 认证管理器(AuthenticationManager)

核心接口AuthenticationManager 是认证入口,默认实现为 ProviderManager
职责:遍历所有 AuthenticationProvider,找到支持当前 Authentication 类型的提供者。

public interface AuthenticationManager {Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

4. 认证提供者(AuthenticationProvider)

实现类示例
DaoAuthenticationProvider:基于数据库的认证(使用 UserDetailsService 加载用户)。
JwtAuthenticationProvider:验证 JWT 令牌。
OAuth2LoginAuthenticationProvider:处理 OAuth2 授权码流程。
认证逻辑

  1. 调用 UserDetailsService.loadUserByUsername() 加载用户信息。
  2. 使用 PasswordEncoder.matches() 验证密码(或验证令牌有效性)。
  3. 返回包含权限信息的 Authentication 对象。

5. 用户信息加载(UserDetailsService)

核心接口UserDetailsService 负责从数据源(如数据库、LDAP)加载用户信息。

public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

自定义实现:覆盖此接口以适配业务用户表结构。


6. 密码编码器(PasswordEncoder)

作用:加密存储密码,验证用户输入密码。
常用实现
BCryptPasswordEncoder:使用 BCrypt 哈希算法。
Argon2PasswordEncoder:更安全的 Argon2 算法。
配置示例

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

7. 安全上下文(SecurityContext)

存储位置:认证成功后,Authentication 对象存入 SecurityContextHolder

SecurityContextHolder.getContext().setAuthentication(authenticatedAuth);

存储机制:默认使用 ThreadLocal,确保线程安全。


8. 认证后处理

成功处理
• 重定向到目标页面(如 defaultSuccessUrl)。
• 生成会话 Cookie(若启用 Session)。
失败处理
• 抛出 AuthenticationException(如 BadCredentialsException)。
• 返回 401 错误或跳转登录页。


9. 异常处理(ExceptionTranslationFilter)

职责:捕获认证/授权异常,转换为 HTTP 响应。
AuthenticationEntryPoint:处理未认证请求(如跳转登录页)。
AccessDeniedHandler:处理权限不足(返回 403)。


认证流程图解

HTTP 请求↓
SecurityContextPersistenceFilter(加载 SecurityContext)↓
UsernamePasswordAuthenticationFilter(提取用户名密码)↓
AuthenticationManager.authenticate()↓
DaoAuthenticationProvider(验证用户)↓   ↖ UserDetailsService.loadUserByUsername()↓   ↖ PasswordEncoder.matches()↓
认证成功 → SecurityContextHolder 保存 Authentication↓
FilterSecurityInterceptor(授权检查)↓
访问受保护资源

不同认证方式流程差异

1. 表单登录

流程:用户提交表单 → UsernamePasswordAuthenticationFilterDaoAuthenticationProvider → 重定向到成功页面。

2. OAuth2 登录

流程:用户点击第三方登录 → 重定向到授权服务器 → 返回授权码 → 换取令牌 → OAuth2LoginAuthenticationProvider 验证令牌 → 创建用户会话。

3. JWT 无状态认证

流程:请求携带 JWT → JwtAuthenticationFilter 解析令牌 → JwtAuthenticationProvider 验证签名 → 直接访问资源。


关键配置示例

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll().anyRequest().authenticated()).formLogin(form -> form.loginPage("/login").defaultSuccessUrl("/home")).oauth2Login(oauth2 -> oauth2.loginPage("/oauth2/login").defaultSuccessUrl("/user"));return http.build();}@Beanpublic UserDetailsService userDetailsService() {return new InMemoryUserDetailsManager(User.withUsername("user").password("{bcrypt}...").roles("USER").build());}
}

总结

Spring Security 的认证流程通过 过滤器链组件协作 实现灵活扩展,核心步骤包括:

  1. 请求拦截:通过过滤器链处理不同认证方式。
  2. 凭证验证:由 AuthenticationManagerAuthenticationProvider 协作完成。
  3. 上下文存储:认证信息保存在 SecurityContextHolder
  4. 权限控制:通过 AccessDecisionManager 实现资源访问控制。

开发者可通过自定义组件(如 UserDetailsServiceAuthenticationProvider)适配业务需求,实现从简单表单登录到复杂 OAuth2 集成的各类场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCP Server 实现一个 天气查询

​ Step1. 环境配置 安装 uv curl -LsSf https://astral.sh/uv/install.sh | shQuestion: 什么是 uv 呢和 conda 比有什么区别? Answer: 一个用 Rust 编写的超快速 (100x) Python 包管理器和环境管理工具,由 Astral 开发。定位为 pip 和 venv 的替代品…

MySQL执行计划

MySQL 的 执行计划(Execution Plan) 是优化器根据 SQL 语句生成的查询执行路径的详细说明。通过分析执行计划,可以了解 MySQL 如何处理 SQL 查询(如索引使用情况、表连接顺序等),进而优化查询性能。 1. 获…

数据大屏点亮工业互联网的智慧之眼

在当今数字化飞速发展的时代,数据已成为企业决策的核心依据,而数据大屏作为数据可视化的重要工具,正逐渐成为工业互联网领域不可或缺的一部分。通过直观、动态的可视化展示,数据大屏能够将复杂的数据转化为易于理解的图表和图形&a…

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS!这款由花儿不哭大佬精心打造的语音克隆神…

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…

【Unity】合批处理和GPU实例化的底层优化原理(完)

【Unity】批处理和实例化的底层优化原理 URP1.基础概念SetPassCallsDrawCallsBatches 2.重要性排序既然如此为什么仍然要合批? 3.unity主流的合批优化方案和优先级Early-Z透明物体情况 4.合批(小场景但是很复杂很多小物件刚需)合并纹理图集更…

当人类关系重构:从“相互需要”到“鹅卵石化”——生成式人工智能(GAI)认证的角色与影响

在数字化浪潮的席卷之下,人类社会正经历着前所未有的变革。人与人之间的连接方式、互动模式以及价值认同,都在悄然发生着变化。这一过程中,一个显著的现象是,人与人之间的关系逐渐从传统的“相互需要”模式,转变为一种更为复杂、多元且稳定的“鹅卵石化”结构。在此背景下…

ctfhow——web入门171~175

sql简介 web入门171 ——判断注入点: -1 union select 1,2,3 -- 其实在这之前可以先判断多少列,即 -1‘ group(order) by 3 -- group by用于将具有相同值的行分组成一个汇总行,可以查看是否报错确定列数 2&#x…

vue遗漏的知识点(动态组件.组件库的操作使用)

----动态组件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的内置组件&#xff0c;用于动态渲染其他组件。:is 属性 用于指定要渲染的组件。它的值可以是&#xff1a; 组件的名称&#xff08;字符串&#xf…

ip改变导致的数据库连接不上

前言 需要用到路由器&#xff0c;所以先把家里的路由器给拆了先用着。新的路由器到了之后&#xff0c;更换上新的路由器之后&#xff0c;调用到服务会有报错&#xff0c;记录一下更换路由器之后ip重新分配服务可能会报的错. 进一步可以看到有关网路在服务当中的影响。 正文 …

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

基于HTML5的3D魔方项目开发实践

基于HTML5的3D魔方项目开发实践 这里写目录标题 基于HTML5的3D魔方项目开发实践项目概述核心技术实现1. 3D效果实现CSS3 3D变换魔方结构设计 2. 交互控制实现动画控制键盘控制触摸控制 技术难点与解决方案1. 3D变换控制2. 触摸体验优化3. 动画性能优化 项目收获总结项目展望 项…

23种设计模式-原型(Prototype)设计模式

原型设计模式 &#x1f6a9;什么是原型设计模式&#xff1f;&#x1f6a9;原型设计模式的特点&#x1f6a9;原型设计模式的结构&#x1f6a9;原型设计模式的优缺点&#x1f6a9;原型设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是原型设计模式…

【MATLAB例程】交互式多模型(IMM),模型使用:CV,CT左转、CT右转,二维平面,三个模型的IMM,滤波使用EKF。订阅专栏后可查看代码

简单的介绍:本文所述的代码实现了一种基于交互多模型(IMM)算法的目标跟踪仿真,适用于复杂运动目标(如匀速、转弯运动)的状态估计。代码通过三个运动模型(匀速CV、左转弯CT1、右转弯CT2)的协同滤波,动态调整模型概率,最终输出综合跟踪结果。代码包含完整的仿真数据生成…

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…

PHP中yield关键字的使用

PHP版本>5.5 原理&#xff1a;yield关键字会生成一个Generator类的对象&#xff0c;PHP通过Generator实例计算出下一次迭代的值&#xff0c;再次返回一个Generator对象并停止循环&#xff08;即循环一次执行一次&#xff09;。 理解&#xff1a;使用在for/foreach/while循…

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …

Linux目录及文件管理

目录 一.Linux目录基本结构 1.常见目录及其作用 二.常用文件处理命令 1.七类常见的linux的文件 2.cat&#xff08;查看文件内容&#xff09; 3.more(分页查看文件内容&#xff09; 4.less(分页查看文件内容&#xff09; 5.head&#xff08;从头部查看文件内容&#xff0…

电机控制常见面试问题(二十)

文章目录 一.整流电路绕组接法二.电机为什么需要转速器三.电机转矩产生原理四.电机控制中载波频率大小的确定五.开关周期 Tpwm 一.整流电路绕组接法 为了引出直流的输出&#xff0c;一定要在整流变压器的二次侧引出零线&#xff0c;所以二次侧绕组必须接成星形 一次绕组必须要…

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…