# 如何在 Spring 中处理登录身份验证

> 原文： [https://javatutorial.net/how-to-handle-login-authentication-in-spring](https://javatutorial.net/how-to-handle-login-authentication-in-spring)

在本文中，您将学习如何使用 Spring Security 实现登录身份验证功能。
![spring-featured-image](img/d2f73752d8ae931b119dec1eac866973.jpg)
登录页面表示一种表单，要求用户名和密码之类的详细信息。 可以在 Angular 中完成相同的登录页面，并且身份验证过程本身将由 Spring Security 执行。

从服务器中获取一个令牌，然后将其发送回客户端。 此外，服务器希望**相同的**令牌用于依维签名请求**及以后**。

## 工作流程

如上所述，当用户提交登录表单时，他必须输入用户名和密码（最常见）。 当他**提交**表单时，会有一个 API 调用，该 API 调用来自 Spring Web 。 该路径可能类似于`/login`，并通过 HTTP POST 方法调用。

您可以在前端（例如 Angular）中编写身份验证逻辑。 但是在本文中，我们将在服务器端（也称为 Spring）上编写它。 我们可以通过两种方法来实现我们的目标。 一种是通过编写控制器类，另一种是通过扩展[`UsernamePasswordAuthenticationFilter`](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html)。我们将使用第一种方法 - 通过创建`login`方法来验证用户身份并返回`true`或`false`。

`ControllerClass.java`

```java
// the POST method
@PostMapping(value="/login")
public boolean login(@RequsetBody Employee reqEmployee, HttpServletRequest request) {
	Authentication auth = null;
	UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(reqEmployee.getUsername(), reqEmployee.getPassword());

	try {
		auth = authenticationProvider.authenticate(token);
		SecurityContextHolder.getContext().setAuthentication(auth);
		Employee employee = (Employee) authentication.getPrincipal();
		employee.setPassword(null);
		return true;
	}
	catch (BadCredentialsException exception) {
		// you can also log the exception message, for example using Logger
		return false;
	}
}
```

这是一种简单的 POST 方法，根据用户是否已成功通过身份验证，它会返回`true`或`false`。

**细分**

首先，我们创建**身份验证**以充当**身份验证**实例，首先我们将其设为`null`。 然后，我们为用户输入的用户名和密码生成一个身份验证令牌。 然后我们有一个`try{} catch(){}`块，其中`try`根据令牌对用户进行身份验证，如果一切成功，则返回`true`。 另一方面，如果未通过身份验证并返回`false`，则将运行`catch`。

同样，此方法应在`Controller`类中。