Spring如何处理登录认证

时间:2020-02-23 14:34:20  来源:igfitidea点击:

在本文中,我们将学习如何使用springsecurity来实现登录身份验证功能。

登录页面表示一个表单,该表单要求提供用户名和密码等详细信息。同样的登录页面可以在Angular中完成,身份验证过程本身将由springsecurity执行。

有一个令牌从服务器抓取,然后发送回客户端。此外,服务器期望每个signle请求 继续使用 相同令牌。

工作流

当用户提交登录表单时,如前所述,他必须输入用户名和密码(大多数情况下)。当他 提交表单时,有一个来自springweb的API调用。路径可能看起来像*/login*,并通过HTTPPOST方法调用。

我们可以在前端编写身份验证逻辑,例如Angular。但是在本文中,我们将在服务器端,也就是Spring上编写它。我们有几种方法可以实现我们的目标。一种是通过编写控制器类,另一种是通过扩展UsernamePasswordAuthenticationFilter。我们将使用第一种方法-通过创建一个 login方法来验证用户并返回true或者false

控制器类.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。

故障

首先,我们创建 auth作为一个 Authentication实例,首先我们将其设为null。然后我们为用户输入的用户名和密码生成一个身份验证令牌。然后我们有一个 **tray{}catch(){}]块, 尝试根据令牌对用户进行身份验证,如果一切成功,则返回true。 catch另一方面,如果没有通过身份验证,则运行 catch并返回false。

同样,这个方法应该在控制器类中。