Spring Security 认证流程分析

简介: Spring Security 认证流程分析

基本认证

在Spring Boot项目中使用Spring Security非常方便,创建一个新的Spring Boot项目,我们只需要引入Web和Spring Security依赖即可。引入Spring Security 依赖后,项目中的所有接口就都被保护起来了,此时访问接口就可以看到登录页面了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</ dependency>

AuthenticationManager

AuthenticationManager是一个认证管理器,它定义了Spring Security过滤器要如何执行认证操作。
AuthenticationManager在认证成功后,会返回一个Authentication对象,这个Authentication对象会被设置到SecurityContextHolder中。
AuthenticationManager是一个接口,它有着诸多的实现类,开发者也可以自定义AuthenticationManager的实现类,不过在实际应用中,我们使用最多的是ProviderManager。在Spring Security框架中,默认也是使用ProviderManager。

AuthenticationProvider

Spring Security支持多种不同的认证方式,不同的认证方式对应不同的身份类型,AuthenticationProvider就是针对不同的身份类型执行具体的身份认证。例如,常见的DaoAuthenticationProvider用来支持用户名/密码登录认证,RememberMeAuthenticationProvider用来支持"记住我"的认证。

ProviderManager

ProviderManager是AuthenticationManage的一个重要实现类。

在Spring Security中,由于系统可能同时支持多种不同的认证方式,例如同时支持用户名/密码认证、
RememberMe认证、手机号码动态认证等,而不同的认证方式对应了不同的AuthenticationProvider,所以一个完整的认证流程可能由多个AuthenticationProvider来提供。多个AuthenticationProvider将组成一个列表,这个列表将由ProviderManager代理。换句话说,在ProviderNanager中存在一个AuthenticationProvider列表,在ProviderManager中遍历列表中的每一个AuthenticationProvider去执行身份认证,最终得到认证结果。
ProviderManager本身也可以再配置一个AuthenticationManager作为porent,这样当ProviderManager认证失败之后,就可以进入到parent中再次进行认证。理论上来说,ProviderManager的parent可以是任意类型的AuthenticationManager,但是通常都是由ProviderManager来扮演parent的角色,也就是ProviderManager是ProviderManager的parent。

AbstractAuthenticationProcessingFilter

AbstractAuthenticationProcessingFilter可以用来处理任何提交给它的身份认证。

配置多个数据源

同时支持多张用户表

多个数据源是指在同一个系统中,用户数据来自不同的表,在认证时,如果第一张表没有查找到用户,那就去第二张表中查询,依次类推。
要实现这个需求就很容易,认证要经过AuthenticationProvider,每一个AuthenticationProvider中都配置了一个ulserDetailsService,而不同的UlserDetailsService则可以代表不同的数据源。所以我们只需要手动配置多个AuthenticationProvider,并为不同的AuthenticationProvider提供不同的UserDetailsService即可。

登录验证码

登录验证码也是项目中一个常见的需求,但是Spring Security对此并未提供自动化配置方案,需要开发者自行定义。一般来说,有两种实现登录验证码的思路:
(1)自定义过滤器。
(2)自定义认证逻辑。
除了使用自定义一个生成工具类,也可以使用一些现成的开源库来实现,例如kaptcho。

目录
相关文章
|
1月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
79 5
|
1月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
404 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
167 2
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析(五)-策略模式
spring源码设计模式分析(五)-策略模式
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
102 5
|
2月前
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析(六)-模板方法模式
spring源码设计模式分析(六)-模板方法模式
|
2月前
|
XML 存储 Java
Spring-源码深入分析(二)
Spring-源码深入分析(二)
|
2月前
|
XML 设计模式 Java
Spring-源码深入分析(一)
Spring-源码深入分析(一)
|
1月前
|
JSON 前端开发 JavaScript
优雅!Spring Boot 3.3 实现职责链模式,轻松应对电商订单流程
本文介绍如何使用 Spring Boot 3.3 实现职责链模式,优化电商订单处理流程。通过将订单处理的各个环节(如库存校验、优惠券核验、支付处理等)封装为独立的处理器,并通过职责链将这些处理器串联起来,实现了代码的解耦和灵活扩展。具体实现包括订单请求类 `OrderRequest`、抽象处理器类 `OrderHandler`、具体处理器实现(如 `OrderValidationHandler`、`VerifyCouponHandler` 等)、以及初始化职责链的配置类 `OrderChainConfig`。