在 Web 应用开发中,安全认证是保护系统资源和用户数据的核心需求。Spring Boot 3.4.3 结合 Spring Security 6.4.2 提供了一个强大而灵活的安全框架,可以轻松实现用户身份认证功能。本文将详细介绍如何在 Spring Boot 3.4.3 中整合 Spring Security 6.4.2,实现简单的内存认证,并附上完整代码示例,助你在2025年的项目中快速构建安全认证机制。
1. Spring Security 简介
1.1 什么是 Spring Security?
Spring Security 是 Spring 生态中的安全框架,提供认证、授权和防护功能。它支持多种认证方式(如表单登录、OAuth2 等),并与 Spring Boot 无缝集成。Spring Security 6.4.2 引入了 Lambda 风格的配置方式,更加简洁和现代化。
1.2 为什么选择 Spring Security?
- 灵活性:支持内存、数据库等多种认证源。
- 安全性:内置防护机制(如 CSRF、XSS)。
- 易用性:与 Spring Boot 集成后配置简单。
1.3 本文目标
- 配置 Spring Security 基础环境。
- 实现基于内存的简单身份认证。
- 提供登录和受保护接口示例。
2. 项目实战
以下是基于 Spring Boot 3.4.3 整合 Spring Security 6.4.2 实现简单身份认证的完整步骤。
2.1 添加 Maven 依赖
在 pom.xml
中添加必要的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.3</version>
</parent>
<groupId>cn.itbeien</groupId>
<artifactId>springboot-security-simple</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
</project>
说明:
spring-boot-starter-security
:提供 Spring Security 的核心功能。
2.2 配置 Spring Security
创建一个 Security 配置类,实现内存认证:
package cn.joyous.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public").permitAll() // 公开接口
.anyRequest().authenticated() // 其他需认证
)
.formLogin(form -> form // 默认表单登录
.defaultSuccessUrl("/home") // 登录成功跳转
)
.logout(logout -> logout
.logoutSuccessUrl("/public") // 退出后跳转
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
var user = User.withUsername("admin")
.password("{noop}123456") // {noop} 表示明文密码
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
代码说明:
SecurityFilterChain
:定义安全过滤规则。InMemoryUserDetailsManager
:内存存储用户信息。{noop}
:不加密密码,仅用于演示。
2.3 创建控制器
提供测试接口:
package cn.joyous.controller;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/public")
public String publicEndpoint() {
return "这是一个公开接口,无需登录";
}
@GetMapping("/home")
public String home(@AuthenticationPrincipal UserDetails userDetails) {
return "欢迎回来, " + userDetails.getUsername() + "!";
}
}
2.4 启动与测试
- 启动 Spring Boot 应用。
- 访问
http://localhost:8080/public
,无需登录即可访问。 - 访问
http://localhost:8080/home
,跳转到默认登录页。 - 输入用户名
admin
和密码123456
,登录后显示欢迎信息。 - 点击退出,跳转回
/public
。
3. 进阶功能(可选)
-
密码加密
添加 BCrypt 加密:@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
更新用户密码:
var user = User.withUsername("admin") .password(passwordEncoder().encode("123456")) .roles("USER") .build();
-
自定义登录页
创建login.html
并配置:.formLogin(form -> form .loginPage("/login") .permitAll() )
<!DOCTYPE html> <html> <body> <h1>登录</h1> <form method="post" action="/login"> <input type="text" name="username" placeholder="用户名"/> <input type="password" name="password" placeholder="密码"/> <button type="submit">登录</button> </form> </body> </html>
-
角色权限控制
添加角色限制:.authorizeHttpRequests(auth -> auth .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() )
4. 总结
Spring Boot 3.4.3 整合 Spring Security 6.4.2 提供了一种简单而强大的方式来实现身份认证。本文通过内存认证展示了基本配置和使用方法,适合快速搭建原型或学习安全框架。