Spring Security基础:快速搭建安全认证系统
大家好,我是你们的老朋友Java老张,一名在大厂干了3年后端开发的工程师,业余时间也在B站做技术UP主。最近收到很多小伙伴私信问我:“Spring Security到底怎么入门?能不能写一篇零基础也能看懂的教程?”
说实话,我当初学的时候也踩过不少坑——文档看不懂、配置一错就崩、连登录页面都跑不出来……所以我决定写这篇纯实战、无废话、手把手带你跑通的入门教程。无论你是学生、转行者,还是刚入行的新人,只要会写“Hello World”,就能跟着做完!
一、Spring Security 是什么?能帮运营团队解决什么问题?
简单说:Spring Security 是 Java 生态中最主流的安全框架,专门用来保护你的 Web 应用。
- 它能自动拦截未登录用户访问后台
- 能区分“普通用户”和“管理员”的权限
- 能防止常见的攻击(比如 CSRF、暴力破解)
- 对运营团队来说,它意味着:你不用自己从零写登录、注册、权限控制逻辑,省下大量开发时间,让产品更快上线!
💡 举个例子:你们公司要做一个内部管理系统,只有员工才能登录,且财务只能看报表,HR 只能管员工信息。这些需求,Spring Security 几行代码就能搞定。
二、环境准备:5 分钟搭好开发环境
我们用最简单的组合:Java + Maven + Spring Boot
所需工具清单:
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 推荐使用 LTS 版本 |
| IDE | IntelliJ IDEA / VS Code | 能写 Java 就行 |
| 构建工具 | Maven | 项目依赖管理 |
| Spring Boot | 3.x | 最新稳定版 |
创建项目步骤:
- 打开 https://start.spring.io
- 填写:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x(最新)
- Group:
com.example - Artifact:
security-demo
- Dependencies(关键!) 添加:
Spring WebSpring Security
点击 “Generate”,下载 ZIP 并解压,用 IDE 打开即可。
✅ 验证是否成功:运行
SecurityDemoApplication.java,访问http://localhost:8080,如果跳转到一个默认的登录页(用户名user,密码在控制台打印),说明环境 OK!
三、核心概念:3 个关键词搞懂 Spring Security
别被“安全框架”吓到,其实就三个核心概念:
1. 认证(Authentication)
“你是谁?” —— 验证用户名密码是否正确。
2. 授权(Authorization)
“你能干什么?” —— 比如只有
/admin/**路径允许 ROLE_ADMIN 访问。
3. 过滤器链(Filter Chain)
所有请求进来前,先经过 Spring Security 的“安检门”,不符合规则直接拦下。
🧠 我当初学的时候总混淆“认证”和“授权”。记住:先认证(登录),再授权(权限)。
四、实战项目:手把手搭建一个带登录的后台系统
我们要做一个极简的“内容管理系统”:
/public:所有人可访问/user:登录用户可访问/admin:只有管理员能访问
步骤 1:写几个测试接口
// src/main/java/com/example/securitydemo/controller/TestController.java
@RestController
public class TestController {
@GetMapping("/public")
public String publicPage() {
return "这是公开页面,谁都能看!";
}
@GetMapping("/user")
public String userPage() {
return "欢迎登录用户!";
}
@GetMapping("/admin")
public String adminPage() {
return "管理员专属页面!";
}
}
步骤 2:配置安全规则(重点!)
新建配置类:
// src/main/java/com/example/securitydemo/config/SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public").permitAll() // 公开路径
.requestMatchers("/user").authenticated() // 需要登录
.requestMatchers("/admin").hasRole("ADMIN") // 需要 ADMIN 角色
.anyRequest().authenticated() // 其他所有请求都要登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页(可选)
.permitAll() // 登录页本身要公开
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
// 内存中创建两个测试用户(仅用于演示!)
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("alice")
.password("{noop}123456") // {noop} 表示明文密码(生产环境必须加密!)
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("bob")
.password("{noop}admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
🔐 注意:
{noop}是告诉 Spring 密码没加密。实际项目必须用 BCrypt 加密! 后面会讲。
步骤 3:测试效果
启动项目,依次访问:
| URL | 预期结果 |
|---|---|
http://localhost:8080/public |
直接显示内容 |
http://localhost:8080/user |
跳转到登录页 → 用 alice / 123456 登录 → 显示欢迎信息 |
http://localhost:8080/admin |
用 alice 登录后仍被拒绝;用 bob / admin123 登录才成功 |
✅ 成功!你已经实现了基础的认证+授权!
五、新手常见问题 & 解决方案
❓ 问题1:为什么登录后总是跳回首页,而不是我原来想访问的页面?
原因:Spring Security 默认登录成功后跳转到 /。
解决方案:在 formLogin 中配置:
.formLogin(form -> form
.defaultSuccessUrl("/user", true) // true 表示强制跳转,false 表示跳回原地址
)
推荐用 false,体验更好。
❓ 问题2:密码明明对,却提示“Bad credentials”
原因:Spring Security 3.x 默认要求密码加密,而你用了 {noop} 但忘了加前缀。
检查点:
- 密码是否写成
"{noop}123456"? - 如果用加密,必须用
PasswordEncoder。
❓ 问题3:如何自定义登录页面?
- 创建
src/main/resources/templates/login.html(需引入 Thymeleaf) - 在配置中指定:
.loginPage("/login") // 对应 GET /login 返回页面
- 确保表单字段名为
username和password
📌 提示:初学者建议先用默认登录页,跑通后再美化。
❓ 问题4:角色(ROLE)和权限(Authority)有什么区别?
- 角色(Role):是权限的集合,通常以
ROLE_开头(如ROLE_ADMIN) - 权限(Authority):更细粒度的操作,如
user:delete,article:publish
在代码中:
.hasRole("ADMIN")等价于.hasAuthority("ROLE_ADMIN")- 建议:简单系统用 Role,复杂系统用 Authority
六、学习建议 & 下一步路线
恭喜你!已经掌握了 Spring Security 的核心能力。但别止步于此,以下是进阶建议:
🔜 下一步学什么?
| 主题 | 说明 |
|---|---|
| 密码加密 | 用 BCryptPasswordEncoder 替代 {noop} |
| 数据库存储用户 | 把 InMemoryUserDetailsManager 换成数据库查询 |
| JWT 认证 | 适用于前后端分离项目(如 Vue + Spring Boot) |
| OAuth2 / 微信登录 | 实现第三方登录 |
| 方法级权限 | 用 @PreAuthorize 控制 Service 层权限 |
⚠️ 避坑指南(血泪经验!)
- 永远不要在生产环境用明文密码
- 不要关闭 CSRF 保护(除非做 API 且有其他防护)
- 测试时用内存用户,上线前务必切数据库
- Spring Boot 3.x 要求 Java 17+,别用旧版本 JDK
结语
这篇教程从零开始,带你用不到 100 行代码实现了一个完整的安全认证系统。我特意避开了复杂的理论,只保留最实用的部分——因为学会比学全更重要。
如果你觉得有帮助,欢迎去 B站 搜 “Java老张”,我会持续更新 Spring Security 进阶系列(包括 JWT、RBAC 权限模型等)。也欢迎在评论区留言你的问题,我会一一解答!
最后送大家一句话:安全不是功能,而是底线。 一个没有安全防护的系统,就像没上锁的家门——迟早出事。
祝你编码顺利,少加班,多涨薪!

评论 0