跳到主要内容
版本:7.0.2

基本身份验证

DeepSeek V3 中英对照 Basic Basic Authentication

本节详细介绍了 Spring Security 如何为基于 servlet 的应用程序提供对 Basic HTTP 认证 的支持。

本节将介绍 HTTP 基本认证在 Spring Security 中的工作原理。首先,我们看到 WWW-Authenticate 标头被发送回未经身份验证的客户端:

basicauthenticationentrypoint

图 1. 发送 WWW-Authenticate 标头

上图基于我们的SecurityFilterChain示意图构建。

1 首先,用户向资源 /private 发起一个未经身份验证的请求,而该用户对此资源并无访问权限。

2 Spring Security 的 AuthorizationFilter 通过抛出 AccessDeniedException 来表明未认证的请求被拒绝

3 由于用户未通过身份验证,ExceptionTranslationFilter 启动了开始身份验证。配置的 AuthenticationEntryPointBasicAuthenticationEntryPoint 的一个实例,它会发送一个 WWW-Authenticate 标头。RequestCache 通常是一个 NullRequestCache,它不会保存请求,因为客户端能够重放其最初发出的请求。

备注

默认的 HTTP 基本认证提供者会在请求带有 X-Requested-By: XMLHttpRequest 头时,在 401 响应中同时抑制响应体和 WWW-Authenticate 头。这使得前端可以实现自己的认证代码,而不是触发浏览器的登录对话框。如需覆盖此行为,请实现你自己的 BasicAuthenticationEntryPoint

当客户端收到 WWW-Authenticate 头时,它就知道应该使用用户名和密码重试。下图展示了用户名和密码的处理流程:

basicauthenticationfilter

图 2. 用户名与密码认证

上图基于我们的SecurityFilterChain示意图构建。

1 当用户提交用户名和密码时,BasicAuthenticationFilter 会从 HttpServletRequest 中提取用户名和密码,并创建一个 UsernamePasswordAuthenticationToken,这是一种 Authentication 类型。

2 接下来,UsernamePasswordAuthenticationToken 被传入 AuthenticationManager 进行认证。AuthenticationManager 的具体实现取决于用户信息的存储方式

3 如果身份验证失败,则返回 Failure

  1. SecurityContextHolder 被清空。

  2. 调用 RememberMeServices.loginFail。如果未配置记住我功能,此操作无效。请参阅 Javadoc 中的 RememberMeServices 接口。

  3. 调用 AuthenticationEntryPoint 以再次触发发送 WWW-Authenticate。请参阅 Javadoc 中的 AuthenticationEntryPoint 接口。

4 如果认证成功,则显示 成功

默认情况下,Spring Security 的 HTTP 基本认证支持是启用的。然而,一旦提供了任何基于 servlet 的配置,就必须显式地配置 HTTP 基本认证。

以下示例展示了一个最小化的显式配置:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
// ...
.httpBasic(withDefaults());
return http.build();
}