spring security解析

news2025/7/13 16:28:14

Spring Security 中文文档 :: Spring Security Reference

1. 密码存储

最早是明文存储,但是攻击者获得数据库的数据后就能得到用户密码。

于是将密码单向hash后存储,然后攻击者利用彩虹表(算法高级(23)-彩虹表(Rainbow Table)_彩虹表下载-CSDN博客)可以快速的根据hash值获取密码。

于是人们将密码加盐后hash,这种方式增加了存储密码的复杂度,使得预先根据简单字符串生成的彩虹表不会那么容易的匹配到存储的复杂密码hash值。

但是现代硬件每秒几十亿次hash计算,可以轻松的暴力破解(依次尝试各种字节组合,并匹配存储的hash值)。

2. 配置类加载

spring-boot-autoconfigure-3.4.4.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports

springboot会扫描并加载该文件中的配置类

org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration#defaultSecurityFilterChain:springboot默认在该方法中注册SecurityFilterChain

filter注册到servlet容器的过程:

首先,DelegatingFilterProxyRegistrationBean(实现了ServletContextInitializer)在SecurityFilterAutoConfiguration(在imports文件中)中被注册为一个bean,然后,其在context容器初始化时注册了DelegatingFilterProxy过滤器。SecurityFilterAutoConfiguration中使用springSecurityFilterChain作为受委托的filter。springSecurityFilterChain通过WebSecurityConfiguration注册为bean,WebSecurityConfiguration是由SpringBootWebSecurityConfiguration的内部类WebSecurityEnablerConfiguration注册的,SpringBootWebSecurityConfiguration是在SecurityAutoConfiguration(在imports中)中导入的。

springSecurityFilterChain是一个FilterChainProxy类型的bean

DefaultSecurityFilterChain在SecurityFilterChainConfiguration中被注册

@Bean
@Order(2147483642)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests((requests) -> {
        ((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated();
    });
    http.formLogin(Customizer.withDefaults()); // 表单认证,即使用UsernamePasswordAuthenticationFilter 
    http.httpBasic(Customizer.withDefaults());
    return (SecurityFilterChain)http.build();
}

UserDetailsServiceAutoConfiguration:注册了InMemoryUserDetailsManager作为UserDetailsService用来获取用户信息。

3. 过滤器

DelegatingFilterProxy:使用过滤器bean来实现过滤,是sevlet容器标准与spring bean之间的桥梁。sevlet容器可以通过自己的标准注册filter,但是无法检测到spring bean,于是先注册DelegatingFilterProxy作为标准过滤器,然后DelegatingFilterProxy将工作委托给spring的过滤器bean。DelegatingFilterProxy的另一个好处是延迟查找filter bean,servlet容器需要在启动前完成filter的注册,但是使用DelegatingFilterProxy的话可以在servlet容器启动后再完成filter bean的加载。作为一个Filter的代理,将工作委托给filter bean。

FilterChainProxy:一个filter bean,可以链式调用多个filter,包含在DelegatingFilterProxy,被委托来执行过滤工作。包含多个SecurityFilterChain,每个SecurityFilterChain含有0个或多个filter,根据请求确定使用哪个SecurityFilterChain。

SecurityFilterChain:包含多个filter。

多个SecurityFilterChain的图示:

ExceptionTranslationFilter:将 AccessDeniedException 和 AuthenticationException 翻译成 HTTP 响应。

异常处理图示:

  • 1 首先,ExceptionTranslationFilter 调用 FilterChain.doFilter(request, response) 来调用应用程序的其他部分。

  • 2 如果用户没有被认证,或者是一个 AuthenticationException,那么就 开始认证

    • SecurityContextHolder 被清理掉。

    • HttpServletRequest 被保存起来,这样一旦认证成功,它就可以用来重放原始请求。

    • AuthenticationEntryPoint 用于请求客户的凭证。例如,它可以重定向到一个登录页面或发送一个 WWW-Authenticate 头。

  • 3 否则,如果是 AccessDeniedException,那么就是 Access Denied。 AccessDeniedHandler 被调用来处理拒绝访问(access denied)。

RequestCacheAwareFilter:使用 RequestCache 来保存 HttpServletRequest

保存认证前的请求,以在认证后继续访问:

@Bean DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception { HttpSessionRequestCache requestCache = new HttpSessionRequestCache(); requestCache.setMatchingRequestParameterName("continue"); http // ... .requestCache((cache) -> cache .requestCache(requestCache) ); return http.build(); }

不保存请求:

@Bean
SecurityFilterChain springSecurity(HttpSecurity http) throws Exception {
    RequestCache nullRequestCache = new NullRequestCache();
    http
        // ...
        .requestCache((cache) -> cache
            .requestCache(nullRequestCache)
        );
    return http.build();
}

注意:当你把你的 filter 声明为 Spring Bean 时要小心,可以用 @Component 注解它,也可以在配置中把它声明为 Bean,因为 Spring Boot 会自动 在嵌入式容器中注册它。这可能会导致 filter 被调用两次,一次由容器调用,一次由 Spring Security 调用,而且顺序不同。另外自定义的filter可以从 OncePerRequestFilter 中继承,而不是实现 Filter,这是一个基类,用于每个请求只调用一次的 filter,并提供一个带有 HttpServletRequest 和 HttpServletResponse 参数的 doFilterInternal 方法。

自定义过滤器:

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        // ...
        .addFilterBefore(new TenantFilter(), AuthorizationFilter.class);
    return http.build();
}

4. 日志

logging.level.org.springframework.security=TRACE

5. 认证

流程:

当一个未认证的请求到达后,首先AuthorizationFilter抛出AccessDeniedException,然后ExceptionTranslationFilter使用AuthenticationEntryPoint(LoginUrlAuthenticationEntryPoint)返回一个响应,该响应向客户端要求用户凭证(如重定向到登录页)。

当含有凭证的请求到达后,AbstractAuthenticationProcessingFilter(如UsernamePasswordAuthenticationFilter )用来验证该凭证,它首先从HttpServletRequest中提取出待验证的Authentication(如oauth2的token、用户名密码UsernamePasswordAuthenticationToken),然后将Authentication传给AuthenticationManager执行验证,验证通过后在SecurityContextHolder中设置Authentication,验证失败则清空SecurityContextHolder。

AuthenticationManager:用来执行Authentication中凭证的验证工作,其实现一般为ProviderManager。

ProviderManager:通过AuthenticationProvider列表来验证凭证,多个AuthenticationProvider依次执行。

AuthenticationProvider:具体执行验证工作的组件,有多种类型,如 DaoAuthenticationProvider验证用户名密码,JwtAuthenticationProvider验证令牌。

Authentication:

Authentication 接口在Spring Security中主要有两个作用。

  • 对 AuthenticationManager 的一个输入,用于提供用户为验证而提供的凭证。当在这种情况下使用时,isAuthenticated() 返回 false

  • 代表当前认证的用户。你可以从 SecurityContext 中获得当前的 Authentication

认证(Authentication)包含了:

  • principal: 识别用户。当用用户名/密码进行认证时,这通常是 UserDetails 的一个实例。

  • credentials: 通常是一个密码。在许多情况下,这在用户被认证后被清除,以确保它不会被泄露。

  • authorities: GrantedAuthority 实例是用户被授予的高级权限。两个例子是角色(role)和作用域(scope)。

GrantedAuthority:代表一个权限,一个用户可能有多个权限。 

JdbcUserDetailsManager :用来通过jdbc获取用户信息,默认的表结构在文件org/springframework/security/core/userdetails/jdbc/users.ddl中

SecurityContextRepository:用来存储securitycontext供后续的用户请求使用。HttpSessionSecurityContextRepository将securitycontext存在session中根据cookied的sessionid识别用户。

SecurityContextHolderFilter:负责将securitycontext从SecurityContextRepository中取出并设置到SecurityContextHolder中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机C语言

1、stdint.h简介 stdint.h 是从 C99 中引进的一个标准 C 库的文件 路径:D:\MDK5.34\ARM\ARMCC\include 大家都统一使用一样的标准,这样方便移植 配置MDK支持C99 位操作 如何给寄存器某个值赋值 举个例子:uint32_t temp 0; 宏定义 带参…

多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)

目录 一.摘要 二. Introduction 三. Related Work A. 特定任务图像融合方法 B. 通用图像融合方法 C. 视觉 Transformer 四.方法 A. 整体框架 B. 损失函数 C.解析 1. 整体框架 2. 特征提取 3. 注意力引导的跨域融合 五. 实验结果与讨论 A. 实验配置 B. 实现…

IDEA202403常用快捷键【持续更新】

文章目录 一、全局搜索二、美化格式三、替换四、Git提交五、代码移动六、调试运行 在使用IDEA进行程序开发,快捷键会让这个过程更加酸爽,下面记录各种快捷键的功能。 一、全局搜索 快捷键功能说明Shift Shift全局搜索Ctrl N搜索Java类 二、美化格式 …

从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香

视频讲解: 从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香 Label Studio 支持图像、文本、音频、视频、时间序列等多类型数据标注,覆盖计算机视觉(目标检测、语义分割)、自然语言处理&#x…

【ESP32】ESP-IDF开发 | 低功耗蓝牙开发 | GAP协议 + 设备扫描例程

1. 简介 1.1 GAP协议 GAP(General Access Protocol),全称通用访问协议,它定义了低功耗蓝牙设备的发现流程,设备管理和设备连接的建立。 低功耗蓝牙设备定义了4种角色: 广播者(Broadcaster&…

网络开发基础(游戏)之 Socket API

Socket简介 Socket (套接字)是网络编程的基础,在 C# 中通过 System.Net.Sockets 命名空间提供了一套完整的 API 来实现网络通信。 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一个Socket。 一个Socket包含了进行网络通信必…

行为审计软件:企业合规与内部监控的数字守门人

在当今高度数字化的商业环境中,企业运营产生的电子数据呈指数级增长,员工行为也日益复杂多样。行为审计软件应运而生,成为现代企业管理不可或缺的工具。这类软件通过系统化记录、分析和报告组织内部用户活动,帮助企业管理风险、确…

bat脚本转换为EXE应用程序文件

很多时候,我们使用电脑时会编辑bat脚本文件 很多时候,我们制作的玩笑,病毒也会使用这个格式. 但这个格式也有很多缺点 1,如果是需要管理员运行的程序,需要费劲的自己使用管理员身份运行 2,文件并不为大家所熟知,认同度不高 3,可以非常轻松的看到原代…

细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法

目录 一、函数vTaskList() 1、 函数说明 2、返回的字符串表格说明 3、函数的使用方法 二、 vTaskList()的应用示例 1、示例功能、项目设置 2、软件设计 (1)main.c (2)freertos.c (3)FreeRTOSConf…

DNS主从同步

安装软件 主配置中完成DNS解析:192.168.131.134 [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# vim /etc/yum.repos.d/myrepo.repo [base] namebase baseurl/mnt/BaseOS gpgchcek0 enable1 [base2] namebase2 baseurl/mnt/AppStream gpgchcek0 enab…

双指针算法(部分例题解析)

快慢指针左右指针 前言 双指针,它通过设置两个指针来遍历数据,从而实现高效的查找、排序、去重等操作。双指针算法的核心在于通过合理地移动这两个指针,减少不必要的遍历,提高算法的效率。 283. 移动零 - 力扣(LeetCo…

解决Windows打印问题的集成软件

家里或公司电脑经常为连不上打印机而烦恼,今天给大家推荐一款修复打印工具,该工具是采用易语言开发的集成化打印机故障修复软件,专为解决 Windows 系统(含 32/64 位 Windows 7/10/11)中因权限配置、服务异常、补丁缺失…

警惕阿里云中的yum update操作不当导致:/sbin/init被清空导致Linux无法正常启动

由于使用阿里云进行部署测试,因而会对yum update进行操作,这两天更新了systemd-239-82.0.3.4.al8.2.x86_64,但存在报错,然后进行yum history undo和清空yum cache,但出现操作Linux命令行无效。具体来说,几个…

关系型数据库MYSQL(续)

目录 三.MySQL事务原理分析 1.事务是什么? 2.执行事务的目的是什么? 3.事务是由什么组成的? 4.事务的特征是什么? 5.事务控制语句 6.ACID特性 6.1原子性(A) 6.2隔离性(I) …

WInform当今技术特性分析

Windows Forms (WinForms) 技术特性分析 引言 Windows Forms (WinForms) 作为微软最早推出的基于.NET的图形用户界面开发框架,已经存在了20多年。在如今充满了各种现代UI框架的软件开发生态系统中,WinForms仍然保持着其独特的地位。本文将深入分析WinF…

运筹学之模拟退火

目录 一、历史二、精髓思想三、案例与代码实现 一、历史 问:谁在什么时候提出模拟退火?答:模拟退火算法(Simulated Annealing,SA)是由斯图尔特柯尔斯基(Scott Kirkpatrick) 等人在 …

树莓派5-开发应用笔记

0.树莓派系统目录 /home:用户目录。 除了root用户外,其他所有的使用者的数据都存放在这个目录下,在树莓派的系统中,/home目录中有一个pi的子目录,这个就是pi用户的默认目录。 /bin: 主要放置系统的必备执行文件目录。 …

8.5/Q1,Charls最新文章解读

文章题目:Atherogenic index of plasma, high sensitivity C-reactive protein and incident diabetes among middle-aged and elderly adults in China: a national cohort study DOI:10.1186/s12933-025-02653-4 中文标题:中国中老年人群血…

k8s 调整Node节点 Max_Pods

默认情况下,Kubernetes集群中一个Node最多能起110个Pod。 这是基于性能和资源管理的考虑,以确保Kubernetes集群的稳定性和可靠性。 查看kht125节点上支持的最大pod数量: kubectl describe node kht125 | grep -i “Capacity|Allocatable” -A 6 调整…

使用Service发布前后端应用程序

使用Service发布前后端应用程序 文章目录 使用Service发布前后端应用程序[toc]一、创建并发布后端应用程序二、创建并发布前端应用程序三、通过前端发送流量进行测试 部署前端(Frontend)微服务和后端(Backend)微服务是比较常见的应…