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

如果你刚开始学习Java后端开发,可能会遇到一个问题:我写了一个网页应用,但如何保护它的安全性呢?比如不让陌生人访问某些页面,或者区分不同用户的权限?
这时候,我们就要用到一个非常强大的工具 —— Spring Security。
一句话概括:
Spring Security 是一个用于保护 Java Web 应用的安全框架,它可以控制用户能不能登录、能不能访问某个页面、有没有操作权限等。
简单来说,它就像你家的大门和保安系统。没有它,别人可以直接走进你的房子;有了它,你可以设置只有持有钥匙(比如用户名密码)的人才能进门,并且根据他们的身份决定他们能去哪些房间。
在本篇文章中,我们将从零开始一步步搭建一个简单的带有用户登录功能的 Spring Boot 项目,并使用 Spring Security 来实现基础的安全控制。
环境准备:你需要准备好这些工具

要完成本次实践,你需要以下几个开发环境和工具:
1. Java 开发环境
- JDK版本:至少 1.8
- 推荐使用 OpenJDK 或 Oracle JDK
2. IDE(集成开发环境)
- 推荐使用 IntelliJ IDEA(社区版即可) 或 Eclipse
3. Maven
- 构建项目依赖管理工具,IDE 中一般内置了,如果没有需要单独安装
4. 浏览器
- Chrome 或 Edge(方便调试接口)
5. Postman(可选)
- 调试 API 的工具,也可以用浏览器发送请求
第一步:创建一个 Spring Boot 项目
你可以通过以下两种方式创建项目:
方法一:使用 Spring Initializr
- 打开网站,填写如下信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 可选最新稳定版本,如 3.x
- Group: com.example
- Artifact: demo-security
- Name: DemoSecurityApplication
- Dependencies:
- Spring Web
- Spring Security

点击 “Generate” 下载压缩包,解压后导入 IDEA 即可。
方法二:使用 IntelliJ IDEA 创建
- 在 IDEA 中选择 "New Project"
- 选择 Spring Initializr
- 填写基本信息
- 选择依赖:Spring Web + Spring Security
核心概念:Spring Security 的几个关键知识点
为了让你更好地理解后面代码的作用,先来认识几个核心概念:
| 概念 | 通俗解释 |
|---|---|
| 认证(Authentication) | 验证用户是不是他所说的那个人(比如输入用户名密码) |
| 授权(Authorization) | 决定用户能不能执行某个操作(比如管理员可以删除数据,普通用户不行) |
| 用户详情服务(UserDetailsService) | 提供用户的信息,比如账号、密码、权限等 |
| 安全配置类(SecurityConfig) | 我们自己写的类,用来定义安全规则 |
接下来我们会逐一了解它们,并结合代码进行演示。
实战项目:跟着教程一步步搭建安全认证系统
我们将完成以下目标:
- 创建一个登录页面
- 实现用户名/密码登录
- 设置两个角色:USER 和 ADMIN
- 限制 /user 页面只能由 USER 访问,/admin 页面只能由 ADMIN 访问
第一步:添加依赖
打开 pom.xml 文件,确认已经包含以下两个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
如果没有,请手动添加。
第二步:编写登录页面(可选,如果不想写页面可以用 Postman 模拟登录)
我们可以先写一个简单的登录页面 login.html,放在 src/main/resources/templates/ 目录下(注意需要引入 Thymeleaf 模板引擎)。
添加 Thymeleaf 支持
在 pom.xml 中加入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后新建 login.html 文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h2>请登录</h2>
<form action="/login" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
接着,我们写一个控制器来显示登录页:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AuthController {
@GetMapping("/login")
public String loginPage() {
return "login";
}
}
第三步:自定义用户信息与角色
为了让 Spring Security 知道有哪些用户,我们需要定义用户和他们的权限。
最简单的方式是直接在 application.properties 文件中配置内存中的用户:
spring.security.user.name=admin
spring.security.user.password=123456
spring.security.user.roles=ADMIN
spring.security.user.name=user
spring.security.user.password=123456
spring.security.user.roles=USER
这样我们就有了两个用户:
| 用户名 | 密码 | 角色 |
|---|---|---|
| admin | 123456 | ADMIN |
| user | 123456 | USER |
第四步:配置安全规则
现在我们要告诉 Spring Security:哪些页面需要验证,哪些页面必须有特定角色才能访问。
我们新建一个配置类 SecurityConfig.java:
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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// 配置用户及角色
@Bean
public UserDetailsService userDetailsService(PasswordEncoder encoder) {
UserDetails user = User.withUsername("user")
.password(encoder.encode("123456"))
.roles("USER")
.build();
UserDetails admin = User.withUsername("admin")
.password(encoder.encode("123456"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// 配置加密方式(推荐使用 BCrypt)
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 配置安全规则
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 主页无需登录
.requestMatchers("/user/**").hasRole("USER") // /user 开头的页面需要 USER 角色
.requestMatchers("/admin/**").hasRole("ADMIN") // /admin 开头的页面需要 ADMIN 角色
.anyRequest().authenticated()) // 其他请求都需要登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页路径
.defaultSuccessUrl("/home") // 登录成功后的跳转地址
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
这段代码看起来有点长,我们来逐个解释一下它的含义:
userDetailsService:告诉 Spring Security 有哪些用户存在passwordEncoder:设置密码加密方式(BCrypt 更加安全)securityFilterChain:定义 URL 的访问规则
第五步:创建受保护的页面
我们再创建几个测试页面来验证我们的权限设置。
创建一个新的 Controller 类:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/")
public String home() {
return "主页";
}
@GetMapping("/user/home")
public String userHome() {
return "这是普通用户页面";
}
@GetMapping("/admin/dashboard")
public String adminDashboard() {
return "这是管理员页面";
}
@GetMapping("/home")
public String afterLogin() {
return "登录成功";
}
}
第六步:运行并测试
启动项目后,在浏览器访问:
/→ 主页(所有人都能访问)/user/home→ 必须登录为USER用户才能访问/admin/dashboard→ 必须登录为ADMIN用户才能访问/login→ 登录页面
尝试输入不同的用户名和密码看看能否访问对应页面。
常见问题解答
Q1:为什么不能访问 /user/home 页面?
- 可能原因:你没有以具有
USER角色的用户登录 - 解决方法:尝试使用用户名
user密码123456登录后再访问
Q2:密码对为什么提示登录失败?
- 检查是否正确设置了密码编码器
PasswordEncoder - 如果你是直接从数据库读取用户,可能没有使用正确的加密方式
Q3:无法访问自定义登录页面?
- 确保控制器方法返回的视图名和
templates文件夹下的.html文件名一致 - 并检查是否引入了 Thymeleaf 依赖
Q4:忘记添加 spring-security 依赖怎么办?
- 回到
pom.xml中添加对应的 dependency 即可
学习建议:下一步该怎么学?
恭喜你完成了第一个 Spring Security 项目的搭建!现在你知道了:
- 如何创建一个安全的 Web 应用
- 如何配置用户、角色和访问权限
- 如何保护你的 URL
接下来推荐你继续学习:
- 数据库认证:使用 MySQL、PostgreSQL 连接数据库验证用户
- 记住我功能(Remember Me):让系统记住用户一段时间内不需要重新登录
- JWT 认证:适用于前后端分离架构的身份验证方式
- OAuth2 登录:接入微信、QQ、GitHub 等平台登录
- 权限注解:使用
@PreAuthorize、@Secured控制方法级别的权限
推荐资源:
- 官方文档:https://spring.io/projects/spring-security
- B站视频:搜索“Spring Security 教程”
- GitHub 示例项目:搜索 “spring boot security example”
总结
在这篇教程中,你亲手完成了以下事情:
✅ 创建了一个 Spring Boot 项目
✅ 引入了 Spring Security 依赖
✅ 配置了用户和角色
✅ 定义了 URL 安全规则
✅ 实现了登录和权限控制功能
这只是一个起点。Spring Security 功能强大、灵活,后续还有许多高级功能等着你去探索。
坚持动手、多做练习,你会发现安全编程并没有那么难,而且特别实用!
如有疑问,欢迎留言讨论或查阅更多资料。祝你学习愉快 😊

评论 0