Spring Security基础:快速搭建安全认证系统
大家好,我是小林,一名211高校的计算机研究生,平时喜欢写技术博客帮助编程新人少走弯路。今天这篇教程的起因,是我看到很多刚接触后端开发的同学在做毕业设计或小项目时,总卡在“用户登录”这个环节——要么自己手写一堆验证逻辑,要么直接放弃权限控制。其实,Spring Security 就是为解决这个问题而生的!
虽然标题提到了“区块链”和“Go”,但别担心——它们只是关键词要求,并非本教程的核心内容。我会在文末简单说明它们与安全系统的关联,避免误导。现在,让我们专注把 Spring Security 的基础用法 学扎实。
一、Spring Security 是什么?
简单说,Spring Security 是一个用于保护 Java 应用的安全框架。它能帮你自动处理:
- 用户登录/登出
- 密码加密存储
- 权限控制(比如只有管理员能删数据)
- 防止常见攻击(如 CSRF、Session 固定)
我当初学的时候,以为它很复杂,结果发现:只要会写 Hello World,就能跑通一个带登录页的系统!
二、环境准备(5分钟搞定)
你需要以下工具:
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 推荐使用 LTS 版本 |
| Maven | 3.6+ | 项目依赖管理 |
| IDE | IntelliJ IDEA / VS Code | 带 Spring Boot 插件更好 |
| 浏览器 | Chrome / Edge | 用于测试 |
创建项目
- 访问 Spring Initializr
- 选择:
- Project: Maven
- Language: Java
- Spring Boot: 最新稳定版(如 3.2.x)
- Dependencies: Spring Web, Spring Security
- 点击 Generate,下载并解压项目
💡 提示:如果你用 IDEA,可以直接在 New Project 中选择 Spring Initializr,勾选上述依赖。
三、核心概念:用大白话讲清楚
1. 认证(Authentication) vs 授权(Authorization)
- 认证:你是谁?(输入账号密码验证身份)
- 授权:你能干什么?(普通用户不能删别人文章)
2. Security Filter Chain(安全过滤链)
Spring Security 会在每个请求前插入一系列“检查关卡”。比如:
请求 → 检查是否登录 → 检查是否有权限 → 放行/拒绝
3. PasswordEncoder(密码编码器)
永远不要明文存密码! Spring Security 强制你使用加密算法(如 BCrypt)。
四、实战:5步搭建一个带登录的系统
目标:访问
/hello需要登录,访问/public不需要。
步骤 1:添加依赖(pom.xml 已自动生成)
确认 spring-boot-starter-security 在依赖中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
步骤 2:创建一个简单的 Controller
// src/main/java/com/example/demo/HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, authenticated user!";
}
@GetMapping("/public")
public String publicPage() {
return "This is public for everyone.";
}
}
步骤 3:配置 Security(重点!)
// src/main/java/com/example/demo/SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public").permitAll() // 允许所有人访问 /public
.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(passwordEncoder().encode("123456")) // 密码必须加密
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 使用 BCrypt 加密
}
}
步骤 4:启动应用
运行 DemoApplication.main(),控制台会输出一行日志:
Using generated security password: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
这是 Spring Security 自动生成的临时密码(仅当未配置用户时出现)。但我们已经配置了用户 alice/123456,所以忽略它。
步骤 5:测试
- 访问
http://localhost:8080/public→ 直接显示内容 ✅ - 访问
http://localhost:8080/hello→ 跳转到默认登录页 - 输入用户名
alice,密码123456→ 登录成功,显示 Hello 信息 ✅
🎉 恭喜!你已拥有一个带认证的系统。
五、新手常见问题解答
Q1:为什么我的密码总是验证失败?
原因:你可能把密码明文写进了配置,但 Spring Security 要求必须加密存储。
✅ 解决方案:务必通过 passwordEncoder().encode("原始密码") 生成密文。
Q2:如何自定义登录页面?
在 formLogin() 中指定 .loginPage("/my-login"),然后创建对应的 Controller 和 HTML 页面即可。
Q3:每次重启用户就没了怎么办?
当前我们用的是内存用户(InMemoryUserDetailsManager)。真实项目要用数据库,后续可学习 JdbcUserDetailsManager 或自定义 UserDetailsService。
Q4:和 Go、区块链有什么关系?
- Go:Go 语言也有类似的安全框架(如 Gin + JWT),但本教程专注 Java 生态。
- 区块链:某些去中心化身份(DID)系统会用区块链存证,但传统 Web 应用仍以中心化认证为主。初学者先掌握 Spring Security,再拓展其他领域更高效。
六、学习建议 & 避坑指南
下一步学什么?
- 集成数据库:用 MyBatis/JPA 读取用户表
- JWT 无状态认证:适合前后端分离项目
- OAuth2:实现微信/Google 第三方登录
我踩过的坑(避雷!)
- ❌ 不要关闭 CSRF 防护(除非做 API 且用 Token)
- ❌ 不要在生产环境用内存用户
- ✅ 优先使用 Spring Boot 3.x + Java 17+,避免兼容问题
推荐学习路径
Spring Security 基础 → 数据库集成 → JWT → OAuth2 → 微服务安全
结语
Spring Security 初看复杂,但只要理解“认证 + 授权”的核心思想,配合代码实践,很快就能上手。安全不是功能,而是底线——哪怕你的项目再小,也值得花 30 分钟加上基础防护。
如果你觉得这篇教程有帮助,欢迎关注我的博客!下期我会写《Spring Security + JWT 实现前后端分离认证》,敬请期待。
作者:小林|211 计算机研二|坚持写让新人看得懂的技术文

评论 0