零基础也能搭:用Spring Security给Java项目加把锁
大家好,我是工作5年的后端开发工程师。这几年带过不少实习生,也帮朋友改过简历,发现一个普遍现象:很多同学的Java项目功能很完整,唯独缺了“安全认证”这一环。一问原因,不是觉得难,就是不知道从哪下手。
其实我当初学的时候也一样——看到“Spring Security”这几个字就头大,文档又厚,概念又多。但后来发现,只要抓住核心思路,搭一个基础的安全系统,10行代码就能跑起来。
今天这篇教程,我就用最直白的方式,带你从零开始,快速搭建一个带登录认证的Java Web项目。无论你是学生、转行者,还是正在完善简历项目的开发者,都能跟着做一遍。完成后,你的项目不仅能防未授权访问,还能写进简历里,成为加分项!
为什么需要 Spring Security?
想象一下:你做了一个后台管理系统,任何人都能直接访问 /admin/users 查看所有用户数据——这显然不行。安全认证(Authentication)和权限控制(Authorization) 就是为了解决这个问题:
- 认证(Authentication):你是谁?(比如通过用户名密码登录)
- 授权(Authorization):你能干什么?(比如普通用户不能删管理员)
Spring Security 是 Spring 家族中专门处理这类问题的框架。它像一道门卫,守在你的资源(比如 API 接口、网页)前面,只放行有权限的人。
💡 资源在这里指的是你的项目中任何需要保护的内容,比如
/api/profile、/admin/delete等 URL 路径。
第一步:环境准备
我们需要以下工具:
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | Spring Boot 3.x 要求 JDK 17+ |
| Maven / Gradle | 最新版 | 项目依赖管理 |
| IDE | IntelliJ IDEA / VS Code | 写代码用 |
| Spring Boot | 3.2+ | 快速构建项目 |
创建项目
推荐使用 Spring Initializr 在线生成项目:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x
- Dependencies 添加:
- Spring Web
- Spring Security
下载并解压后,用 IDE 打开,你会看到一个标准的 Spring Boot 项目结构。
第二步:理解核心概念(用大白话)
在动手前,先搞懂三个关键角色:
User(用户)
谁要访问你的系统?每个用户有用户名、密码、角色(如USER,ADMIN)。Resource(资源)
你要保护的东西,比如/api/data这个接口。Policy(策略)
谁能访问什么?比如:“只有 ADMIN 角色才能访问/admin/*”。
Spring Security 的工作流程就像这样:
用户请求 → 拦截器检查是否登录 →
├─ 未登录 → 跳转登录页(或返回401)
└─ 已登录 → 检查是否有权限 →
├─ 有权限 → 放行,执行业务逻辑
└─ 无权限 → 返回403
第三步:实战!5分钟搭一个登录系统
我们来做一个最简版本:访问 /hello 需要登录,且默认用户名密码由系统生成。
1. 添加依赖(如果还没加)
<!-- 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>
2. 写一个测试接口
// HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "你好,认证成功!";
}
}
3. 启动项目!
运行 Application.main(),控制台会打印一行类似这样的日志:
Using generated security password: a1b2c3d4-e5f6-7890-...
这就是 Spring Security 自动生成的临时密码,用户名是 user。
现在打开浏览器访问 http://localhost:8080/hello,你会发现页面跳转到了一个登录框!
输入:
- 用户名:
user - 密码:控制台打印的那一长串
登录成功后,就能看到 “你好,认证成功!”。
✅ 恭喜!你已经拥有了一个带安全认证的 Java 项目。
第四步:自定义用户名和密码
自动生成的密码没法用在真实项目里。我们来改成固定的账号。
方法:配置内存用户(仅用于学习!)
// SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("alice")
.password("{noop}123456") // {noop} 表示不加密
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").authenticated() // /hello 需要登录
.anyRequest().permitAll() // 其他路径开放
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页(可选)
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
重启项目,现在你可以用:
- 用户名:
alice - 密码:
123456
访问 /hello 就能登录了。
⚠️ 注意:
{noop}表示明文密码,生产环境绝对不能这么用!后面我会讲如何加密。
第五步:保护更多资源(URL 权限控制)
假设你有多个接口,想按角色控制:
/api/public→ 所有人可访问/api/user→ 登录用户可访问/api/admin→ 只有 ADMIN 能访问
修改 filterChain 方法:
@Bean
public SecurityFilter擎Chain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public").permitAll()
.requestMatchers("/api/user").hasRole("USER")
.requestMatchers("/api/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(Customizer.withDefaults())
.csrf(csrf -> csrf.disable()); // 开发阶段可关掉 CSRF(生产别关!)
return http.build();
}
同时,在 userDetailsService 中添加一个管理员用户:
UserDetails admin = User.builder()
.username("bob")
.password("{noop}admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
现在:
alice能访问/api/user,但不能访问/api/adminbob两个都能访问
新手常见问题解答
Q1:为什么登录后还是跳回登录页?
可能原因:
- 密码没加
{noop}(Spring Security 默认要求加密) - 路径没配对,比如写了
/hello但实际访问的是/Hello(区分大小写)
Q2:如何加密密码?
不要用 {noop}!应该用 PasswordEncoder:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 创建用户时:
.password(passwordEncoder().encode("123456"))
Q3:能不用表单登录,改用 JSON 登录吗?
可以!但需要自定义 AuthenticationFilter,属于进阶内容。初学者建议先掌握基础。
Q4:这个能写进简历吗?
当然能!你可以在简历的“项目经验”里写:
后台管理系统(Spring Boot + Spring Security)
- 实现基于角色的访问控制(RBAC)
- 使用 BCrypt 加密用户密码
- 保护敏感 API 资源,防止未授权访问
这比“做了个 CRUD 项目”强太多!
学习建议与避坑指南
✅ 正确学习路径
- 先掌握 内存用户 + 表单登录(本文内容)
- 再学 数据库存储用户(用 JPA/MyBatis 读取用户)
- 然后学 JWT 无状态认证(适合前后端分离)
- 最后研究 OAuth2、单点登录等高级主题
❌ 初学者常踩的坑
- 一上来就想做“完美安全系统” → 结果卡住放弃
建议:先跑通最简流程,再逐步增强。 - 忽略 CSRF、CORS 等安全机制 → 以为能跑就行
建议:开发时可暂时关闭,但要知道它们的作用。 - 把密码明文存数据库 → 重大安全隐患
必须:用BCryptPasswordEncoder加密!
下一步该学什么?
完成本文项目后,你可以:
- 连接数据库:把用户信息存到 MySQL,而不是内存
- 集成 JWT:实现
{"username":"alice", "password":"123"}的 JSON 登录 - 添加注册功能:让用户自己注册账号
- 细粒度权限:不只是角色,还能控制“谁能删自己的文章”
每一步都能让你的项目更真实,简历更有料。
结语
Spring Security 看似复杂,但核心思想很简单:拦截请求 → 验证身份 → 放行或拒绝。
我当初也是从“连登录页都出不来”开始的,但只要动手做一次,就会发现它比想象中友好得多。
希望这篇教程能帮你迈出安全开发的第一步。记住:每一个大神,都曾是个连 hello world 都跑不通的新手。
动手试试吧!你的下一个项目,值得被认真保护。

评论 0