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!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部