Spring Security 中多个身份验证

如果你希望只要一个身份验证通过,就不再继续运行下一个身份验证配置,你可以使用 Spring Security 中的 `AuthenticationManager` 和 `ProviderManager` 来实现这一点。

`ProviderManager` 是 Spring Security 的核心组件之一,负责管理一系列的身份验证提供者。默认情况下,它会依次尝试使用每个提供者来验证身份,直到一个提供者验证成功或全部验证失败。

然而,你可以自定义一个 `AuthenticationManager`,将其配置为仅使用第一个验证通过的身份验证提供者。这样,如果第一个提供者成功验证,后续提供者将不会被尝试。

以下是一个简单示例:

```java

@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired

private CustomAuthenticationProvider usernamePasswordAuthProvider;

@Autowired

private TokenAuthenticationProvider tokenAuthProvider;

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.authenticationProvider(usernamePasswordAuthProvider)

.authenticationProvider(tokenAuthProvider);

}

@Bean

@Override

public AuthenticationManager authenticationManagerBean() throws Exception {

return new ProviderManager(Arrays.asList(usernamePasswordAuthProvider, tokenAuthProvider));

}

}

```

在上面的示例中,`ProviderManager` 将被配置为按照提供者列表的顺序进行身份验证,而且只有在第一个提供者成功验证后,后续提供者才不会被尝试。这样,如果第一个提供者验证通过,就不会继续进行下一个提供者的验证。

`ProviderManager` 是 Spring Security 中的核心身份验证管理器,负责管理一系列的身份验证提供者。它的原理基于责任链模式(Chain of Responsibility Pattern),在验证过程中依次尝试每个提供者,直到一个提供者成功验证或全部验证失败。

具体来说,`ProviderManager` 的工作原理如下:

  1. **验证过程触发:** 当一个请求需要进行身份验证时,Spring Security 的过滤器链会触发身份验证过程。`ProviderManager` 被调用来进行实际的身份验证。

  2. **验证提供者列表:** `ProviderManager` 接收一个或多个身份验证提供者,这些提供者实现了 `AuthenticationProvider` 接口。每个提供者负责不同的身份验证方式,例如用户名密码验证、令牌验证等。

  3. **逐一尝试验证:** `ProviderManager` 会按照提供者列表的顺序逐个尝试调用提供者的 `authenticate` 方法进行验证。如果一个提供者成功验证了身份,它会返回一个 `Authentication` 对象,表示验证成功。

  4. **验证中止:** 如果任何一个提供者成功验证,`ProviderManager` 将立即停止后续提供者的验证尝试,并将成功的 `Authentication` 对象返回给调用者。这就是为什么只要一个提供者验证通过,后续提供者不会再被尝试的原因。

  5. **全部验证失败:** 如果所有的提供者都无法验证身份,`ProviderManager` 将抛出适当的异常,表示身份验证失败。

通过这种方式,`ProviderManager` 在实现多个身份验证方式时,能够确保只要有一个验证通过,就停止后续的验证尝试,从而实现了只要一个验证通过就不继续运行下一个的效果。这对于支持多种身份验证方式的场景非常有用,可以根据不同的验证提供者来实现不同的身份验证逻辑。

相关推荐
木头科技11 小时前
AI 工程化第四篇】Spring AI Agent 线上可观测实战:Token 成本、调用链、工具耗时、RAG 命中率怎么监控
java·人工智能·spring
CarIise11 小时前
Spring Boot入门:从项目创建到请求响应实战
spring boot
马剑威(威哥爱编程)12 小时前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
摇滚侠12 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记
imDwAaY13 小时前
Bean的生命周期
java·笔记·后端·学习·spring·dubbo
不停喝水13 小时前
【前端转全栈java速通课】 项目实战④-1 Spring Boot 创建项目-定义接口-请求参数处理-分层规范-依赖注入
java·前端·spring boot
上下求索,莫负韶华13 小时前
Spring全家桶
java·后端·spring
浪子明X14 小时前
用 CMake Presets 固定跨平台构建:从本地开发到 CI 的依赖一致性实践
java·spring·ci/cd
FYKJ_201014 小时前
springboot鲜花销售系统91056-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·mysql·django·课程设计
Wx-bishekaifayuan15 小时前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计