Spring Boot 3.3.0 整合 Spring Security 的详细步骤
Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,通常与 Spring Boot 一起使用来为 Web 应用程序提供安全保障。在本篇文章中,我们将详细介绍如何在 Spring Boot 3.3.0 项目中整合 Spring Security。
步骤一:创建 Spring Boot 项目
首先,使用 Spring Initializr 创建一个新的 Spring Boot 项目。您可以选择使用 Spring Boot 3.3.0,并添加以下依赖项:
- Spring Web
- Spring Security
- Spring Data JPA(可选,若您的应用需要数据库支持)
- H2 Database(可选,用于简单的内存数据库)
步骤二:添加 Maven 依赖
在您的 pom.xml
文件中,确保包含以下依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
步骤三:配置 Spring Security
接下来,我们需要创建一个安全配置类,继承 WebSecurityConfigurerAdapter
。在 Spring Boot 3.x 中,推荐使用新的安全配置方式,下面是一个简单的配置示例:
import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// 关闭CSRF保护
http.csrf().disable()
// 设置请求权限
.authorizeRequests()
.antMatchers("/public/**").permitAll() // 公共接口
.anyRequest().authenticated() // 其余请求需要认证
.and()
.formLogin() // 开启表单登录
.loginPage("/login")
.permitAll() // 登录页面所有人可访问
.and()
.logout() // 开启注销功能
.permitAll();
return http.build();
}
}
步骤四:创建用户服务
为了进行身份验证,我们需要一个用户详情服务。可以创建一个自定义用户服务,实现 UserDetailsService
接口。以下是一个简单的实现:
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class MyUserDetailsService implements UserDetailsService {
// 示例用户数据,您可以从数据库获取真实用户
private static final List<User> USERS = new ArrayList<>();
static {
USERS.add(new User("user", "{noop}password", "ROLE_USER"));
USERS.add(new User("admin", "{noop}admin", "ROLE_ADMIN"));
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return USERS.stream()
.filter(user -> user.getUsername().equals(username))
.findFirst()
.orElseThrow(() -> new UsernameNotFoundException("用户未找到"));
}
}
步骤五:控制器与视图
最后,我们需要创建一些控制器来处理请求。以下是一个简单的控制器示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home"; // 返回视图
}
@GetMapping("/login")
public String login() {
return "login"; // 返回登录视图
}
@GetMapping("/public/hello")
@ResponseBody
public String publicHello() {
return "Hello, this is a public endpoint.";
}
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, this is a secured endpoint.";
}
}
步骤六:创建视图文件
为了支持表单登录,您需要在 src/main/resources/templates
(如果使用 Thymeleaf)按照以下方式创建 login.html
文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form method="post" th:action="@{/login}">
<label>用户名: <input type="text" name="username"/></label><br/>
<label>密码: <input type="password" name="password"/></label><br/>
<button type="submit">登录</button>
</form>
</body>
</html>
结论
通过以上步骤,我们成功地在 Spring Boot 3.3.0 中整合了 Spring Security。此配置适用于简单的应用程序,您可以根据自己的需求进一步定制安全设置,例如使用 JWT、OAuth2 或其他复杂的安全策略。希望这篇文章能帮助您更好地理解和使用 Spring Security!