Spring Security基础:快速搭建安全认证系统
开篇:Spring Security是什么,用来做什么?

如果你是刚开始接触后端开发的新手,可能会听说过“Spring Security”这个名字。那么它到底是什么呢?简单来说,Spring Security 是一个专门为 Java 应用提供安全保护的框架,它可以帮你实现用户登录、权限管理、数据加密等一系列保障系统安全的功能。
在实际开发中,很多应用都需要验证用户身份(比如登录功能),并根据不同的用户角色来限制访问内容(比如普通用户和管理员能看到的内容不同)。这时,Spring Security 就派上用场了。你可以把它想象成你家的门禁系统——它负责识别谁可以进门(认证),以及进门之后能去哪些房间(授权)。
本教程将从零开始,带你一步步搭建一个使用 Spring Security 实现基本安全认证功能的 Spring Boot 项目。即使你没有接触过这个框架,也不用担心,我们从最基础的知识讲起,确保你能轻松入门!
环境准备:搭建开发环境

要开始学习 Spring Security,首先我们需要准备好开发环境。以下是一些必要的工具:
所需工具列表:
- Java 开发环境(JDK)
- IDE(推荐 IntelliJ IDEA 或 Eclipse)
- Maven(用于依赖管理)
- Postman 或浏览器(用于测试接口)
安装步骤:
步骤 1:安装 JDK
- 推荐使用 OpenJDK 17 或更高版本。
- 可以通过 Adoptium 下载适合你操作系统的 JDK 包。
- 安装完成后,在命令行输入
java -version验证是否安装成功。
步骤 2:安装 IDE
- 如果你是新手,建议使用 IntelliJ IDEA 社区版,下载地址:JetBrains官网
- 安装完成后打开软件,稍后我们会创建一个新的 Spring Boot 项目。
步骤 3:配置 Maven
- 大多数 IDE 已经自带 Maven 支持。
- 在项目中我们会使用 Maven 来引入 Spring Security 的相关依赖。
步骤 4:准备测试工具
- 可选地安装 Postman 或直接使用浏览器测试 GET 请求。
核心概念:认识 Spring Security 的关键术语

为了更好地理解后面的操作,我们先介绍几个 Spring Security 中最重要的概念:
1. 认证(Authentication)
认证就是确认“你是谁”。比如你在网站上输入用户名和密码登录的过程,就是在进行认证。
2. 授权(Authorization)
授权是确认“你能干什么”。例如,一个普通用户只能查看信息,而管理员可以添加或删除内容。
3. 用户详情服务(UserDetailsService)
这是一个接口,Spring Security 会通过这个接口获取用户的详细信息(如用户名、密码、权限等)。
4. 安全配置类(SecurityConfig)
这是我们编写配置的地方,告诉 Spring Security 哪些接口需要认证、哪些用户有权限访问等。
5. 内存用户(In-Memory User)
为了让初学者更方便,我们可以直接在代码中定义一个“内存用户”,即不连接数据库,而是把用户信息写死在配置文件或代码里。
实战项目:搭建第一个带安全认证的 Spring Boot 应用
下面我们将一起创建一个 Spring Boot 项目,并使用 Spring Security 实现基本的登录认证功能。
第一步:创建 Spring Boot 项目
你可以使用 Spring Initializr 快速生成项目结构。
选择如下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(如 3.0.x)
- Dependencies:
- Spring Web(用于创建 Web API)
- Spring Security(用于安全控制)
点击 Generate 按钮下载项目压缩包。解压后导入到你的 IDE 中。
第二步:添加 Spring Security 依赖(如果未自动添加)
打开 pom.xml 文件,确认是否有以下依赖(正常情况下已自动生成):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
如果没有,请手动添加。
第三步:创建一个简单的 Controller
新建一个控制器类 HelloController.java:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, welcome to Spring Security world!";
}
}
运行项目,访问 http://localhost:8080/hello,你会发现被重定向到了一个登录页!
这是 Spring Security 自动开启的安全防护机制。下面我们来配置用户名密码。
第四步:配置内存用户
在 application.properties 文件中添加:
spring.security.user.name=admin
spring.security.user.password=123456
重启项目,再次访问 /hello,输入用户名 admin 和密码 123456,就可以正常看到页面内容了!
第五步:编写自定义安全配置类
虽然前面已经完成了简单的认证,但我们还可以自定义更多规则。比如设置多个用户、允许某些接口无需登录访问等。
创建 SecurityConfig.java 类:
package com.example.demo.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.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/public/**").permitAll() // 允许匿名访问 /public 路径下的所有接口
.anyRequest().authenticated() // 其他请求都必须登录才能访问
)
.formLogin(); // 启用默认登录页面
return http.build();
}
}
这段代码做了几件事:
- 创建了两个用户:
user(普通用户)、admin(管理员) - 设置了
/public/**路径下无需登录就能访问 - 其他路径都要求登录
- 启用了表单登录界面
重启项目后,尝试访问:
http://localhost:8080/public/test—— 无需登录即可访问http://localhost:8080/hello—— 输入刚才设置的user/password或admin/admin123登录
🎉 到此为止,你已经搭建了一个完整的基础安全认证系统!
常见问题解答
❓1. 为什么登录页面变成英文了?
Spring Security 默认使用国际化资源包显示语言,默认是英文。你可以通过添加自定义登录页面来更改语言。我们会在后续进阶课程中讲解如何定制登录页。
❓2. 我设置了用户名密码,但不能登录?
检查你的 application.properties 或 SecurityConfig.java 是否正确配置了密码。注意:
- 密码不要忘记
- 使用
.withDefaultPasswordEncoder()时密码明文存储,仅限测试 - 正式项目应使用 BCrypt 加密(高级内容)
❓3. 如何让某个接口不用登录也能访问?
在 SecurityFilterChain 中使用 .requestMatchers("/路径") 配合 .permitAll() 即可,例如:
.requestMatchers("/index", "/about").permitAll()
❓4. 我可以自己写登录页面吗?
当然可以!只需要在配置中添加 .loginPage("/your-login-page"),并处理 POST 提交的 /login 请求。
学习建议:下一步怎么学?
恭喜你完成了本次基础教程!现在你已经掌握了:
✅ 创建 Spring Boot 项目
✅ 引入 Spring Security 并配置内存用户
✅ 控制接口访问权限
✅ 自定义安全配置类
接下来,你可以继续深入以下几个方向的学习:
📚 推荐进阶学习路线:
- 学习使用数据库保存用户信息(JPA + 数据库)
- 实现基于角色的访问控制(Role-Based Access Control)
- 使用 JWT 实现无状态认证(前后端分离场景)
- 集成 OAuth2、GitHub 登录等功能
- 使用 Thymeleaf 编写自定义登录页面
💡 学习建议:
- 动手实践最重要!每学一个知识点都要自己写代码试试
- 多查官方文档:Spring Security Docs
- 不怕报错,遇到问题多看日志,学会 Google 解决方案
- 可以参考一些开源项目加深理解
总结
本教程从零开始,逐步带领大家完成了一个简单的 Spring Security 安全认证系统。希望你现在对 Spring Security 有了初步了解,并能独立搭建自己的项目。
Spring Security 功能强大且灵活,虽然刚开始有些复杂,但只要不断练习,你一定能够掌握它。如果你喜欢这样的教学方式,欢迎继续关注后续的《Spring Security实战进阶》系列教程!
祝你学习顺利,成为一名优秀的后端开发者!🚀

评论 0