零基础也能学会的 Spring Security 快速入门
大家好,我是工作五年多的后端工程师。记得我当初第一次接触 Spring Security 时,光是看官方文档就头晕眼花——一堆过滤器、认证管理器、用户详情服务……简直像在读天书。但其实,Spring Security 的核心思想非常简单:保护你的网站,不让陌生人随便访问。
今天这篇教程,就是想用最直白的方式,带你从零开始搭建一个带登录认证的 Web 应用。不需要你懂 OAuth2、JWT 或微服务,只要会写基本的 Java 代码就行。而且我会结合实际面试题、开发工具(比如 Moltbot 和 ChatGPT),帮你避开我当年踩过的坑。
一、Spring Security 是什么?为什么需要它?
简单说:Spring Security 是 Spring 家族里专门负责“安全防护”的组件。它能帮你实现:
- 用户登录/登出
- 密码加密存储
- 权限控制(比如管理员才能删文章)
- 防止 CSRF、XSS 等常见攻击
没有它,你的网站就像没锁门的房子——谁都能进。而有了它,至少得先“敲门验证身份”。
💡 面试题挑战:
“Spring Security 的核心原理是什么?”
面试官其实在问:它是如何拦截请求并做权限判断的?
答案关键词:过滤器链(Filter Chain)。我们后面会看到。
二、环境准备:5 分钟搭好开发环境
所需工具清单
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 推荐 LTS 版本 |
| Maven | 3.8+ | 项目依赖管理 |
| IDE | IntelliJ IDEA / VS Code | 写代码用 |
| 浏览器 | Chrome / Edge | 测试登录页面 |
创建项目(使用 Spring Initializr)
打开 https://start.spring.io,按如下配置:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x(最新稳定版)
- Dependencies:
- Spring Web
- Spring Security
- Thymeleaf(用于简单页面展示)
点击“Generate”,下载 ZIP 包并解压导入 IDE。
✅ 小技巧:如果你装了 Moltbot(一款智能开发助手插件),可以直接在 IDE 里输入“创建带 Security 的 Spring Boot 项目”,它会自动生成骨架代码!
三、核心概念:三个关键词搞懂 Security
别被术语吓到,记住这三点就够了:
1. Authentication(认证) → “你是谁?”
系统通过用户名+密码确认你的身份。
2. Authorization(授权) → “你能干什么?”
比如普通用户只能看文章,管理员才能删文章。
3. Security Filter Chain(安全过滤器链) → “每条请求都要过安检”
所有 HTTP 请求进来前,都会经过一系列“安检门”(过滤器),决定放行还是拦截。
🧠 类比:就像进机场——先刷身份证(认证),再查行李(授权),整个过程由多个安检点组成(过滤器链)。
四、实战:手把手搭建一个登录系统
我们现在要实现:
- 访问
/admin页面需要登录 - 默认提供一个测试账号:
user / password - 登录成功后跳转首页
步骤 1:什么都不改,直接启动!
运行 Application.java,然后访问 http://localhost:8080。
你会发现:
- 页面自动跳转到
/login - Spring Security 自动生成了一个登录页!
- 控制台打印了一行临时密码,比如:
Using generated security password: a1b2c3d4-e5f6-...
这就是 Spring Boot 的“约定优于配置”——你没写任何代码,它已经帮你做了基础防护!
⚠️ 注意:这个临时密码每次启动都会变,只适合本地测试。
步骤 2:配置固定用户名和密码
在 application.properties 中添加:
spring.security.user.name=admin
spring.security.user.password=123456
重启后,用 admin / 123456 登录即可。
步骤 3:自定义受保护的路径
新建一个配置类:
// src/main/java/com/example/demo/config/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.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // 公开路径
.anyRequest().authenticated() // 其他都需要登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页(可选)
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
🔍 解读:
authorizeHttpRequests:定义哪些路径需要认证formLogin:启用表单登录UserDetailsService:内存中存一个测试用户(生产环境要用数据库!)
步骤 4:创建简单页面测试
新建 src/main/resources/templates/home.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>首页</title></head>
<body>
<h1>欢迎来到首页!</h1>
<p>当前用户:<span th:text="${#authentication.principal.username}"></span></p>
<a href="/admin">进入管理后台</a> |
<a href="/logout">退出登录</a>
</body>
</html>
再建一个 admin.html:
<!DOCTYPE html>
<html>
<body>
<h2>管理员专区</h2>
<p>只有登录用户才能看到这里!</p>
<a href="/">返回首页</a>
</body>
</html>
最后加两个控制器:
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
@GetMapping("/admin")
public String admin() {
return "admin";
}
@GetMapping("/login")
public String login() {
return "login"; // 如果你自定义了登录页
}
}
💡 如果不想写前端,也可以删掉 Thymeleaf 依赖,直接用 REST API 返回 JSON。但对新手来说,看到页面更有成就感!
五、新手常见问题解答
❓ 问题1:为什么我访问根路径 / 被重定向到 /login?
✅ 因为 Spring Security 默认所有路径都需要认证。你可以在 authorizeHttpRequests 中加 .requestMatchers("/", "/public/**").permitAll() 放行首页。
❓ 问题2:密码明文存储会不会不安全?
✅ 绝对不行!上面例子用 withDefaultPasswordEncoder() 只是为了演示。生产环境必须用 BCryptPasswordEncoder:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
然后存密码前先加密:encoder.encode("原始密码")。
❓ 问题3:怎么用数据库查用户?
✅ 把 InMemoryUserDetailsManager 换成你自己的 UserDetailsService 实现,从数据库查用户信息即可。这是下一步要学的内容!
❓ 问题4:ChatGPT 能帮我写 Security 配置吗?
✅ 可以,但要小心!我试过让 ChatGPT 生成配置,结果它用了已废弃的 .antMatchers()(Spring Boot 3 已移除)。建议用它辅助理解逻辑,别直接复制代码。
🛠️ 提示:你可以问 ChatGPT:“用 Spring Boot 3 写一个基于内存用户的 Security 配置”,然后对比本文代码检查是否正确。
六、学习建议与下一步路线
你现在已经掌握了 Spring Security 的“最小可用知识”。接下来可以:
连接真实数据库
实现UserDetailsService,从 MySQL/PostgreSQL 读取用户。集成 JWT(无状态认证)
适合前后端分离项目,用 Token 替代 Session。学习方法级权限控制
比如用@PreAuthorize("hasRole('ADMIN')")注解保护方法。应对真实面试题
- “Security 的过滤器顺序能调整吗?” → 能,通过
addFilterBefore/After - “CSRF 是什么?怎么防?” → 默认开启,前端需携带
_csrftoken
- “Security 的过滤器顺序能调整吗?” → 能,通过
🎯 避坑指南:
别一上来就啃 OAuth2 或 SSO!先把基础认证、权限模型搞清楚,再学高级功能。我见过太多新人被“单点登录”劝退,其实 80% 的项目只需要基础登录。
结语
Spring Security 听起来高大上,但拆开看就是“拦请求 + 验身份 + 查权限”三件事。只要你动手跑一遍上面的代码,就会发现它没那么可怕。
下次遇到“如何保护我的 API?”这种问题,你就能自信地说:“加个 Spring Security,十分钟搞定。”
如果你觉得这篇教程有帮助,不妨试试用 Moltbot 或 ChatGPT 复现一遍,并提问:“这段 Security 配置哪里可以优化性能?” —— 你会学到更多!
加油,未来的架构师!

评论 0