servlet-authentication-passwords-basic.md 4.5 KB
Newer Older
dallascao's avatar
dallascao 已提交
1 2 3 4 5 6
# 基本身份验证

本节详细介绍了 Spring 安全性如何为基于 Servlet 的应用程序提供[基本 HTTP 认证](https://tools.ietf.org/html/rfc7617)支持。

让我们来看看 HTTP Basic 身份验证在 Spring 安全性中是如何工作的。首先,我们看到[WWW-认证](https://tools.ietf.org/html/rfc7235#section-4.1)头被发送回未经验证的客户端。

茶陵後's avatar
茶陵後 已提交
7
![基本验证入口点](https://docs.spring.io/spring-security/reference/_images/servlet/authentication/unpwd/basicauthenticationentrypoint.png)
dallascao's avatar
dallascao 已提交
8 9 10 11 12

图 1。发送 WWW-身份验证报头

该图构建于我们的[`SecurityFilterChain`](../../architecture.html# Servlet-SecurityFilterchain)图。

茶陵後's avatar
茶陵後 已提交
13
![number 1](https://docs.spring.io/spring-security/reference/_images/icons/number_1.png)首先,用户向资源`/private`发出未经授权的请求。
dallascao's avatar
dallascao 已提交
14

茶陵後's avatar
茶陵後 已提交
15
![number 2](https://docs.spring.io/spring-security/reference/_images/icons/number_2.png) Spring security 的[`FilterSecurityInterceptor`](.../授权/authorization/authorization/authorization-requests.html# Servlet-authorization-filtersecurityinterceptor)通过抛出`AccessDeniedException`表示未经验证的请求是*拒绝*
dallascao's avatar
dallascao 已提交
16

茶陵後's avatar
茶陵後 已提交
17
![number 3](https://docs.spring.io/spring-security/reference/_images/icons/number_3.png)由于用户未经过身份验证,[`ExceptionTranslationFilter`](..../architecture.html# Servlet-ExceptionTranslationFilter)发起*启动身份验证*。配置的[`AuthenticationEntryPoint`](../architecture.html# Servlet-authentication-authentryPoint)是[`BasicAuthenticationEntryPoint`](https://DOCS. Spring.io/ Spring-security/site/DOCS/5.6.2/api/org/springframework/security/web/authentification/WWW/basicauthentrypoint.html)的一个实例,它发送一个 WWW-authenticate 报头。`RequestCache`通常是不保存请求的`NullRequestCache`,因为客户机能够重放它最初请求的请求。
dallascao's avatar
dallascao 已提交
18 19 20

当客户端接收到 WWW-Authenticate 报头时,它知道应该使用用户名和密码重试。下面是正在处理的用户名和密码的流程。

茶陵後's avatar
茶陵後 已提交
21
![基本验证过滤器](https://docs.spring.io/spring-security/reference/_images/servlet/authentication/unpwd/basicauthenticationfilter.png)
dallascao's avatar
dallascao 已提交
22 23 24 25 26

图 2。验证用户名和密码

这个图是基于我们的[`SecurityFilterChain`](../../architecture.html# Servlet-SecurityFilterchain)图构建的。

茶陵後's avatar
茶陵後 已提交
27
![number 1](https://docs.spring.io/spring-security/reference/_images/icons/number_1.png)当用户提交他们的用户名和密码时,`BasicAuthenticationFilter`通过从`HttpServletRequest`中提取用户名和密码,创建一个`UsernamePasswordAuthenticationToken`,这是一种[`Authentication`](../architecture.html# Servlet-authentication-authentication)的类型。
dallascao's avatar
dallascao 已提交
28

茶陵後's avatar
茶陵後 已提交
29
![number 2](https://docs.spring.io/spring-security/reference/_images/icons/number_2.png)接下来,将`UsernamePasswordAuthenticationToken`传递到`AuthenticationManager`中以进行身份验证。`AuthenticationManager`的详细内容取决于[用户信息被存储](index.html#servlet-authentication-unpwd-storage)的方式。
dallascao's avatar
dallascao 已提交
30

茶陵後's avatar
茶陵後 已提交
31
![number 3](https://docs.spring.io/spring-security/reference/_images/icons/number_3.png)如果身份验证失败,则*失败*
dallascao's avatar
dallascao 已提交
32 33 34 35 36 37 38

* [SecurityContextholder ](../architecture.html#servlet-authentication-securitycontextholder)被清除。

* 调用`RememberMeServices.loginFail`。如果 Remember Me 没有配置,这是一个禁止操作。

* 调用`AuthenticationEntryPoint`以触发再次发送 WWW-身份验证。

茶陵後's avatar
茶陵後 已提交
39
![number 4](https://docs.spring.io/spring-security/reference/_images/icons/number_4.png)如果身份验证成功,则*成功*
dallascao's avatar
dallascao 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

* [认证](../architecture.html#servlet-authentication-authentication)设置在[SecurityContextholder ](../architecture.html#servlet-authentication-securitycontextholder)上。

* 调用`RememberMeServices.loginSuccess`。如果 Remember Me 没有配置,这是一个禁止操作。

* `BasicAuthenticationFilter`调用`FilterChain.doFilter(request,response)`以继续应用程序逻辑的其余部分。

Spring 默认情况下启用了 Security 的 HTTP Basic 身份验证支持。然而,只要提供了任何基于 Servlet 的配置,就必须显式地提供 HTTP BASIC。

可以在下面找到最小的显式配置:

例 1。显式 HTTP 基本配置

爪哇

```
protected void configure(HttpSecurity http) {
	http
		// ...
		.httpBasic(withDefaults());
}
```

XML

```
<http>
	<!-- ... -->
	<http-basic />
</http>
```

Kotlin

```
fun configure(http: HttpSecurity) {
	http {
		// ...
		httpBasic { }
	}
}
```

[Form](form.html)[Digest](digest.html)