原文: https://javatutorial.net/how-to-handle-login-authentication-in-spring
在本文中,您将学习如何使用 Spring Security 实现登录身份验证功能。
登录页面表示一种表单,要求用户名和密码之类的详细信息。 可以在 Angular 中完成相同的登录页面,并且身份验证过程本身将由 Spring Security 执行。
从服务器中获取一个令牌,然后将其发送回客户端。 此外,服务器希望相同的令牌用于依维签名请求及以后。
工作流程
如上所述,当用户提交登录表单时,他必须输入用户名和密码(最常见)。 当他提交表单时,会有一个 API 调用,该 API 调用来自 Spring Web 。 该路径可能类似于/login
,并通过 HTTP POST 方法调用。
您可以在前端(例如 Angular)中编写身份验证逻辑。 但是在本文中,我们将在服务器端(也称为 Spring)上编写它。 我们可以通过两种方法来实现我们的目标。 一种是通过编写控制器类,另一种是通过扩展UsernamePasswordAuthenticationFilter
。我们将使用第一种方法 - 通过创建login
方法来验证用户身份并返回true
或false
。
ControllerClass.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
类中。