Spring Security 从零搭建:给爬虫加把锁,让简历多一行硬核技能
大家好,我是工作五年的后端开发,也带过不少新人。最近有朋友问我:“想学点能写进简历的安全技术,又怕太难,怎么办?”我想了想——Spring Security 就是个绝佳起点。它不光是企业级 Java 应用的标配,还能让你在项目里“防爬虫”、“做登录”、“控权限”,面试时一说,HR 眼睛都亮了。
我当初学的时候,也被一堆 AuthenticationProvider、UserDetails 吓懵过。但其实,只要动手搭一遍,你会发现它比想象中简单得多。今天这篇教程,就带你 用最短路径,跑通一个带用户名密码登录的安全系统,顺便理解核心概念。全程代码可运行,新手也能跟上。
为什么需要 Spring Security?
想象一下:你写了个 API,返回用户数据。如果谁都能直接调用,那你的数据可能被爬虫批量抓走,甚至被恶意删除。这时候,你需要:
- 用户登录才能访问
- 不同用户看到不同内容(比如管理员 vs 普通用户)
- 防止暴力破解、CSRF 攻击等
Spring Security 就是干这个的——为你的应用加上“门禁系统”。它默认集成在 Spring Boot 里,几行配置就能启用。
第一步:准备开发环境
确保你已安装以下工具(版本不强求,但建议较新):
| 工具 | 版本建议 | 用途 |
|---|---|---|
| JDK | 17 或 21 | Java 运行环境 |
| Maven / Gradle | 最新版 | 项目依赖管理 |
| IDE | IntelliJ IDEA 或 VS Code | 编写代码 |
| 浏览器 | Chrome / Edge | 测试登录 |
创建 Spring Boot 项目
打开 start.spring.io,选择:
- Project: Maven
- Language: Java
- Spring Boot: 3.x(推荐 3.2+)
- Dependencies:
- Spring Web
- Spring Security
- Spring Boot DevTools(可选,热重载)
点击 “Generate”,下载并解压项目,用 IDE 打开。
第二步:理解三个核心概念(用大白话)
别被术语吓到,我用“小区门禁”打比方:
认证(Authentication)
→ 就像保安查你是不是本小区业主。
→ 输入用户名密码,系统验证你是谁。授权(Authorization)
→ 你是业主,但只能进自己楼栋,不能进物业办公室。
→ 系统决定你能访问哪些接口。安全上下文(Security Context)
→ 保安记住你已经通过验证,不用每次进门都查身份证。
→ Spring 把当前用户信息存在一个“临时存储”里,随时可用。
第三步:动手!5 分钟跑通登录功能
1. 启动默认安全配置
在 pom.xml 确认已引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后写一个测试接口:
// HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, secured world!";
}
}
启动应用(mvn spring-boot:run),访问 http://localhost:8080/hello。
神奇的事发生了:页面跳转到 /login,要求输入用户名和密码!
💡 这就是 Spring Security 的“默认保护”:所有接口自动加锁。
控制台会打印一行日志,类似:
Using generated security password: 8a7sdf9a8sdf7a9sdf
这就是临时密码,用户名是 user。
✅ 小技巧:每次重启密码都会变,别记它!
2. 自定义用户名和密码
临时密码没法写进简历项目,我们来配死的账号。
创建配置类:
// SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("admin")
.password("{noop}123456") // {noop} 表示明文密码(仅用于演示!)
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
⚠️ 注意:
{noop}是告诉 Spring “别加密,直接比对”。生产环境必须用加密密码!
重启应用,用 admin / 123456 登录 /hello,成功!
3. 添加角色和权限控制
现在,我们让普通用户只能看 /hello,管理员才能看 /admin。
先加个新接口:
@GetMapping("/admin")
public String adminOnly() {
return "Welcome, admin!";
}
修改 SecurityConfig 中的配置:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin").hasRole("ADMIN") // 需要 ADMIN 角色
.anyRequest().authenticated() // 其他请求只需登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页(可选)
.permitAll() // 登录页无需认证
);
return http.build();
}
同时,在 UserDetailsService 中添加两个用户:
UserDetails admin = User.builder()
.username("boss")
.password("{noop}admin123")
.roles("ADMIN") // 注意:这里写 ADMIN,实际权限是 ROLE_ADMIN
.build();
UserDetails user = User.builder()
.username("guest")
.password("{noop}user123")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, user);
现在:
boss / admin123可以访问/admin和/helloguest / user123只能访问/hello,访问/admin会返回 403
第四步:新手常见问题解答
Q1:为什么密码要加 {noop}?
A:Spring Security 默认要求密码加密。{noop} 是一种“无加密”编码器,仅用于学习。正式项目请用 BCryptPasswordEncoder。
Q2:如何防止爬虫自动登录?
A:默认的表单登录有一定防护,但更有效的是:
- 加验证码(需集成第三方)
- 限制登录失败次数(用
DaoAuthenticationProvider+ 计数器) - 配合 HTTPS 防止密码嗅探
Q3:能不用页面,只用 API 吗?
A:当然!把 .formLogin() 换成 .httpBasic(),就变成 HTTP Basic 认证,适合前后端分离或 API 调用。
Q4:这些代码能写进简历吗?
A:完全可以! 在“项目经验”里写:
“基于 Spring Security 实现 RBAC 权限控制,支持多角色访问隔离,有效防止未授权访问和数据泄露。”
下一步学习建议
你已经掌握了 Spring Security 的骨架,接下来可以:
替换内存用户为数据库用户
→ 实现UserDetailsService,从 MySQL/PostgreSQL 读取用户。使用 JWT 替代 Session
→ 适合移动端或无状态 API,避免服务器存 Session。集成 OAuth2(如微信/Google 登录)
→ 用spring-boot-starter-oauth2-client快速接入。防御 CSRF、XSS 等攻击
→ Spring Security 默认开启 CSRF,但需理解其原理。
🌟 避坑指南:别一上来就学 OAuth2 或 JWT!先搞懂基础认证和授权,再进阶。我见过太多人卡在“连内存用户都配不对”就去啃复杂方案,结果信心崩盘。
结语
今天,你用不到 50 行代码,就搭建了一个带登录、角色控制的安全系统。这不仅是技术分享,更是你简历上“安全能力”的实锤证据。下次有爬虫想偷你数据?让它先过 Spring Security 这关!
记住:安全不是功能,而是底线。哪怕你的项目再小,也值得加一道锁。
动手试试吧,有问题欢迎留言讨论。下期我们讲《用 Spring Security + JWT 做无状态认证》,记得关注!

评论 0