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