基本流程如下:
用户提交登录表单:用户在登录表单中输入用户名和密码,然后提交这些信息到服务器。
接收登录请求:服务器上的一个控制器(如 Spring MVC 控制器)接收到登录请求,从请求中提取用户名和密码。
身份验证:控制器将用户名和密码封装到
UsernamePasswordAuthenticationToken
中,然后通过AuthenticationManager
的authenticate()
方法进行验证。处理认证结果:
- 成功:如果认证成功,服务器通常会创建一个会话(session)或生成一个令牌(如 JWT),并将用户的认证信息存储在会话中或令牌中。然后,用户会被重定向到主页或他们请求的页面。
- 失败:如果认证失败,用户可能会被重定向回登录页面,并显示错误消息。
后续请求的安全性验证:一旦用户登录成功,后续的每个请求都需要通过安全拦截器检查用户是否具有足够的权限访问请求的资源。
注销:用户完成操作后可以选择注销,这时会话会被销毁,或令牌会被标记为无效。
代码举例:
1. Spring Security 配置类
这个类用于配置 Spring Security,定义了哪些路径需要认证,哪些不需要,以及设置了登录和注销的处理逻辑。
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll() // 允许所有人访问首页和/home
.anyRequest().authenticated() // 其他所有请求需要身份认证
.and()
.formLogin()
.loginPage("/login") // 设置登录页面
.permitAll() // 允许所有用户
.and()
.logout()
.permitAll(); // 允许所有用户注销
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER"); // 简单的内存中认证
}
}
2. 控制器实现登录逻辑
这个控制器处理用户登录请求,并返回相应的视图。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login"; // 返回登录页面视图
}
@GetMapping("/home")
public String home() {
return "home"; // 返回主页视图
}
}
3. 登录页面视图(login.html)
这是一个简单的 HTML 登录表单,用户可以输入用户名和密码。
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form action="/login" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Log In"/></div>
</form>
</body>
</html>