Spring Boot Security自动登录
Spring Boot Security是一个用于保护应用程序的框架,提供了身份验证和授权功能。在一些场景中,我们希望用户在成功身份验证后自动登录,而无需再次输入用户名和密码。本文将介绍如何使用Spring Boot Security实现自动登录功能。
1. 添加依赖
首先,我们需要在项目的pom.xml文件中添加Spring Boot Security依赖。在<dependencies>
标签内添加以下代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置Spring Security
接下来,我们需要配置Spring Security以启用自动登录功能。在项目的application.properties
文件中添加以下配置:
spring.security.remember-me.key=mySecretKey
这里的mySecretKey
是一个用于生成记住我令牌的密钥,可以根据实际情况进行修改。
3. 创建登录页面
在Spring Boot中,我们可以使用Thymeleaf模板引擎创建页面。创建一个名为login.html
的文件,并添加以下代码:
<!DOCTYPE html>
<html xmlns:th="
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
Login
<form action="#" th:action="@{/login}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required/><br/>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required/><br/>
<input type="checkbox" id="remember-me" name="remember-me"/>
<label for="remember-me">Remember me</label><br/>
<input type="submit" value="Login"/>
</form>
</body>
</html>
这是一个简单的登录页面,其中包含用户名、密码输入框和一个记住我复选框。
4. 创建登录控制器
接下来,我们需要创建一个登录控制器,处理用户的登录请求。创建一个名为LoginController.java
的文件,并添加以下代码:
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin() {
// 处理登录逻辑
return "redirect:/home";
}
@GetMapping("/home")
public String home() {
return "home";
}
}
在上面的代码中,login()
方法用于返回登录页面,doLogin()
方法用于处理登录请求,home()
方法用于返回登录成功后的页面。
5. 创建登录成功处理器
为了实现自动登录功能,我们需要创建一个登录成功处理器。创建一个名为CustomAuthenticationSuccessHandler.java
的文件,并添加以下代码:
@Component
public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
private PersistentTokenBasedRememberMeServices rememberMeServices;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws ServletException, IOException {
rememberMeServices.loginSuccess(request, response, authentication);
super.onAuthenticationSuccess(request, response, authentication);
}
}
通过继承SavedRequestAwareAuthenticationSuccessHandler
类,我们可以在登录成功后执行自定义逻辑。在上面的代码中,我们调用了loginSuccess()
方法来创建记住我令牌。
6. 配置自动登录
最后,我们需要在Spring Security配置类中启用自动登录功能。创建一个名为SecurityConfig.java
的文件,并添加以下代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthenticationSuccessHandler authenticationSuccessHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.successHandler(authenticationSuccessHandler)
.and()
.rememberMe()
.key("mySecretKey")
.rememberMeServices(rememberMeServices())
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.and()
.csrf().disable();
}
@Bean
public PersistentTokenBasedRememberMeServices rememberMe