Spring Security基础:快速搭建安全认证系统
开篇:Spring Security是什么?它能做什么?

在我们开始编写网络应用时,安全性往往是最容易被忽略的部分之一。然而,在当今互联网环境中,用户数据泄露、非法登录等问题屡见不鲜,因此构建一个安全的后端系统已经成为开发过程中不可或缺的一环。
那什么是 Spring Security 呢?
简单来说,Spring Security 是 Spring 框架的一个子项目,专门用于处理 Web 应用程序中的安全问题。它就像一把“门锁”和“保安”,可以帮助我们:
- 实现用户登录验证(Authentication)
- 控制用户访问权限(Authorization)
- 防止常见攻击(如CSRF攻击)
它的特点是灵活而强大,可以很容易地集成到基于 Spring Boot 的项目中。如果你的目标是构建一个拥有登录注册功能、角色权限控制的基础Web系统,那么从学习 Spring Security 开始是最合适的选择。
今天这篇教程就将带你一步一步实现这样一个系统。别担心你没有 Java 框架经验——只要你会写 Java,并且对 HTTP 协议有最基本的认识,就能完成本教程!
环境准备:搭建你的第一个 Spring Boot 项目

✅ 所需工具
- JDK 8 或以上版本(推荐使用 OpenJDK)
- Maven(自动下载依赖包)
- IntelliJ IDEA / Eclipse / VS Code + Java插件
- 浏览器和 Postman(测试API用)
🚀 步骤一:创建 Spring Boot 项目
你可以通过 Spring Initializr 快速生成项目结构:
- 访问链接。
- 选择以下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 推荐使用 3.x 或以上
- 在 Dependencies 中添加如下模块:
- Spring Web(提供REST服务支持)
- Spring Security(核心安全框架)
- 点击 "Generate" 下载压缩包并解压。
📁 项目目录结构简介
spring-security-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com.example.demosecurity/
│ │ │ ├── DemoSecurityApplication.java
│ │ │ ├── controller/
│ │ │ ├── config/
│ │ ├── resources/
│ │ └── application.properties

核心概念讲解:搞清楚几个基本术语

下面这几个专业术语虽然看起来很高大上,但其实并不难懂。
🔐 Authentication(认证)是什么?
就像进入小区要刷卡一样,用来确认你是谁的过程。
例子:当你输入用户名和密码登录微信,这就是“认证”。
Spring Security 提供了多种方式让你完成这个流程,包括:
- 表单登录(最常见)
- OAuth2(如用微信登录)
- JWT(移动端常用)
🔒 Authorization(授权)又是什么?
类似于“门禁权限”——即使你进了小区,也未必能进物业办公室。
例如:管理员账号能看到所有用户信息,普通用户只能看自己的。这种权限划分就是授权做的事情。
Spring Security 支持对 URL、方法甚至字段级别进行权限控制。
🛡️ Filter(过滤器链)是怎么运作的?
你可以把 Spring Security 想象成一个关卡重重的安检门,每个请求都要过几道检查,比如是否登录、是否有权限等。
整个过程由多个Filter组成,它们按照顺序对请求做不同类型的校验。
👉 我们会在实战部分详细体验它是怎么配置的。
实战项目:动手搭建一个带登录功能的简易API系统

接下来我们要实现一个简单的 REST API 项目,包含两个接口:
| 路径 | 功能 |
|---|---|
/hello |
公开接口,任何人都能访问 |
/api/user |
只有登录用户才能访问 |
第一步:启动默认安全机制(默认用户名密码)
Spring Security 默认会启用一个临时账户来保护你的网站。
修改 application.properties
打开文件路径:resources/application.properties
新增一行:
spring.security.user.name=admin
spring.security.user.password=123456
运行项目,访问任何页面都会跳转到登录页(或弹出 Basic Auth 登录框)。
📌 注意:这只是演示用途,实际应结合数据库使用真实用户信息。
第二步:添加控制器
新建控制器类文件 HelloController.java 存放在 controller 包下:
package com.example.demosecurity.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "欢迎访问公开页面!";
}
@GetMapping("/api/user")
public String userOnly() {
return "这是只有登录用户才能看到的信息!";
}
}
重启项目,然后尝试访问 /api/user 和 /hello:
- 访问
/hello→ 成功显示 - 访问
/api/user→ 出现登录提示
✅ 到这里为止,Spring Security 已经开始生效!
第三步:自定义登录逻辑(关闭默认登录)
现在我们将完全接管登录流程。
创建配置类
新建类文件 SecurityConfig.java:
package com.example.demosecurity.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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
// 使用内存保存两个用户:user(ROLE_USER),admin(ROLE_ADMIN)
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").permitAll()
.anyRequest().authenticated()
)
.formLogin(login -> login
.defaultSuccessUrl("/api/user", true)
);

return http.build();
}
}
📝 解释关键点:
InMemoryUserDetailsManager把用户存储在内存里(仅用于教学示例)authorizeHttpRequests()控制不同URL的访问权限.formLogin()自动提供一个登录页面
🎯 测试效果:
- 访问任意路径,先跳转到登录页(默认路径为
/login) - 使用
user/123456或admin/admin123登录试试看 - 登录成功后会被重定向到
/api/user
第四步:按角色控制权限
我们来升级一下我们的规则:
/api/admin只允许 ROLE_ADMIN 角色访问
更新 HelloController.java 添加新接口:
@GetMapping("/api/admin")
public String adminOnly() {
return "这里是后台管理员专属页面";
}
接着修改配置类 SecurityConfig.java 中的授权规则:
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").permitAll()
.requestMatchers("/api/admin").hasRole("ADMIN") // 限制 ADMIN 角色访问
.anyRequest().authenticated()
)
📌 注意:.hasRole("ADMIN") 内部会自动加上前缀 “ROLE_”,所以不用自己加。
现在尝试用用户 user 登录后访问 /api/admin,你应该会得到 403 错误(Forbidden)。
常见问题解答(FAQ)
Q:为什么我登录一直失败?
A:请检查 withDefaultPasswordEncoder() 的密码是否正确,或者是否启用了 CSRF(后面我们会教你怎么关闭它)。
Q:如何去掉 Spring Security 提供的默认登录页?
A:可以在配置中调用 .httpBasic().disable(); formLogin().disable() 等方法禁用默认行为,再手动实现登录逻辑。
Q:如果我希望记住用户登录状态怎么办?
A:Spring Security 默认使用 session 来保持登录状态。如果是前后端分离项目,考虑使用 JWT 方式替代。
Q:密码一定要明文写吗?
A:不是!目前只是为了方便演示。正式环境必须加密存储密码,通常使用 BCryptEncoder 加密算法。
学习建议:下一步学什么?
恭喜你完成了 Spring Security 的第一个小项目!你已经掌握了入门知识,但这只是冰山一角:
⏭️ 继续学习方向建议:
- 连接数据库:把用户存在数据库而不是内存
- 整合JWT:适用于 App 或前后端分离的认证方案
- RBAC模型:角色+权限管理进阶
- 防止 CSRF/XSS:增强系统安全性
- 多因素认证(MFA):银行级安全认证实现
📚 学习资源推荐:
- 官方文档:https://docs.spring.io/spring-security/reference/
- 视频教程平台:B站搜索 “Spring Security 入门”
- 图书推荐:《Spring Security in Action》(实战风格)
🎉 最后鼓励一句:
安全编程是每一个合格后端程序员必备的能力。今天的每一份代码实践,都会为你日后构建更复杂的系统打下扎实的基础。
继续加油吧,未来的全栈工程师!

评论 0