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

你有没有想过,为什么我们登录网站的时候,必须输入用户名和密码?为什么有些页面只有特定的用户才能访问?这背后其实有一整套“安全机制”在起作用。而Spring Security,就是用来帮助Java程序员快速构建这种“安全机制”的一个强大框架。
简单来说,Spring Security 就是专门帮我们在 Java Web 应用中实现“身份验证(登录)”和“授权(权限控制)”功能的一组工具库。无论你是开发一个博客系统、电商平台还是企业后台管理项目,只要你想保护你的网页或接口不被非法访问,Spring Security 都能帮你搞定。
想象一下你在家里装防盗门,防盗门的功能是识别来人是否是主人(身份验证),并根据他的身份决定他能不能进卧室(授权)。那 Spring Security 就是你这个防盗门背后的“智能锁+人脸识别+门禁系统”。
它常见的功能包括:
- ✅ 用户登录认证(比如账号密码登录)
- ✅ 角色权限划分(比如普通用户 vs 管理员)
- ✅ 页面/接口访问权限控制
- ✅ 登出操作
- ✅ 记住我功能(下次自动登录)
- ✅ 防止常见攻击(比如 CSRF、暴力破解)
如果你是刚入门后端的新手,这篇文章将会带你从零开始,一步步搭建起一个基本的安全认证系统,让你掌握 Spring Security 的基础用法。
环境准备:搭建属于你的开发环境

要学习 Spring Security,你需要先准备好一个标准的 Java Web 开发环境。我们不需要太复杂,只需要以下几个工具就够了:
1. 开发语言与版本要求
- Java 17 或以上(推荐使用 LTS 版本)
- Spring Boot 3.x(本教程以 3.0.5 为例)
- Maven(用于依赖管理)
💡 小贴士:新手建议使用 Spring Initializr 快速生成项目结构,节省时间。
2. 开发工具安装
你还需要以下软件:
- IntelliJ IDEA 社区版 / Eclipse IDE(推荐 IDEA)
- JDK(Java Development Kit)如 OpenJDK
- 任意浏览器(Chrome/Firefox 最佳)
- 可选数据库(H2 Database 内存数据库已够用)
3. 创建新项目(基于 Spring Boot)
打开 https://start.spring.io/,设置如下选项:
| 项目配置 | 值 |
|---|---|
| Project | Maven |
| Language | Java |
| Spring Boot Version | 3.0.x |
| Group | com.example |
| Artifact | security-demo |
| Name | SecurityDemoApplication |
| Packaging | Jar |
| Java Version | 17 |
添加的依赖(Add Dependencies):
- Spring Web:构建Web应用
- Thymeleaf:前端模板引擎(用于展示登录页面)
- Spring Security:重点来了,这就是我们要学的模块

点击 Generate 下载 zip 文件后解压,使用IDEA导入项目即可。
核心概念:理解 Spring Security 中的几个关键角色

虽然代码还没写,但为了更好地理解 Spring Security 的运作原理,我们需要先认识几个关键的术语。这些词汇看起来专业,其实它们的含义并不难懂。
1. Authentication(身份验证)
就是确认你是谁的过程。比如你输入了正确的用户名和密码,系统就认为你是合法用户。你可以把它想成“你是谁”的问题。
2. Authorization(授权)
是在确定你是谁之后,判断你能做什么。例如管理员可以删除文章,普通用户只能阅读,这就叫做授权。你可以把它理解为“你能干啥”。
3. UserDetailsService
是一个接口,负责从哪里加载用户的详细信息。比如我们通常会从数据库中查找用户是否存在,并获取它的密码、角色等信息。
4. UserDetails
代表一个用户的基本信息。包括用户名、密码、角色、是否启用等属性。你可以看作是用户的信息卡片。
5. GrantedAuthority
就是一个权限标识符,通常是角色名称。比如 “ROLE_ADMIN”,表示管理员身份。
✅ 这些概念虽然听起来很学术,但在我们写代码的过程中都会遇到,理解好它们有助于你写出更清晰的 Spring Security 应用。
实战项目:跟着我一步步搭建安全系统(附完整示例)

现在,我们来动手搭建一个最简单的安全认证系统。目标是实现:访问 /home 页面需要登录;默认用户名是 user,密码由系统自动生成;并提供一个退出按钮。
第一步:引入依赖(Maven)
pom.xml 中应包含如下重要依赖(注意版本):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
第二步:创建一个主页控制器
新建一个控制器类 HomeController.java:
package com.example.securitydemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/home")
public String home() {
return "home";
}
}
再创建对应的 Thymeleaf 模板文件 src/main/resources/templates/home.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<h1>欢迎来到首页!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="退出">
</form>
</body>
</html>
此时运行项目(执行主类 SecurityDemoApplication.java),访问 http://localhost:8080/home 你会发现系统自动跳转到了一个登录页面!
这是 Spring Security 自动为我们添加的默认登录页,用户名是 user,密码会在启动时打印在控制台中。
第三步:定义自己的用户信息(内存方式)
现在我们来替换掉默认的用户名密码,改为我们自己指定的用户信息。
创建配置类 SecurityConfig.java:
package com.example.securitydemo.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 {
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("admin")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/home").authenticated()
.anyRequest().permitAll())
.formLogin(form -> form
.loginPage("/login") // 自定义登录页路径
.defaultSuccessUrl("/home", true)
.permitAll())
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.invalidateHttpSession(true));
return http.build();
}
}
这段代码做了哪些事呢?
- 使用内存方式创建了一个用户 admin,密码 123456,角色是 USER。
- 定义了
/home接口需要登录才能访问。 - 定义了一个简单的表单登录流程。
- 启用了登出功能。
第四步:添加登录页面(可选)
创建 login.html 页面:
<!DOCTYPE html>
<html>
<head>
<title>登录页</title>
</head>
<body>
<h2>登录页面</h2>
<form th:action="@{/login}" method="POST">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>

然后在 HomeController.java 中添加一个新的 GET 接口:
@GetMapping("/login")
public String login() {
return "login";
}
重启项目后访问 http://localhost:8080/login,就可以看到我们自己写的登录界面啦!
第五步:测试权限控制(高级实战)
我们再来扩展一下功能,添加一个只有管理员才能访问的页面 /admin。
修改 HomeController.java 添加:
@GetMapping("/admin")
public String admin() {
return "admin";
}
并添加对应页面 templates/admin.html:
<!DOCTYPE html>
<html>
<head>
<title>管理员页面</title>
</head>
<body>
<h1>管理员页面</h1>
</body>
</html>
修改 SecurityConfig.java,给 admin 用户加上 ADMIN 角色:
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("admin")
.password("123456")
.roles("ADMIN") // 修改这里为 ADMIN 角色
.build();
return new InMemoryUserDetailsManager(user);
}
再更新授权规则:
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/home").authenticated()
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().permitAll());
重新运行项目,访问 /admin,只允许具有管理员角色的用户进入。否则就会提示 403(无权限访问)。
常见问题解答(FAQ)
❓1. 登录失败怎么办?
- 确保用户名和密码正确;
- 如果忘记密码,在日志中查看生成的临时密码;
- 检查
SecurityConfig是否关闭了其他接口的匿名访问。
❓2. 总是跳转到错误页面?
检查你的 Thymeleaf 页面路径是否正确放置在 templates 目录下。Spring 默认会去找 .html 页面。
❓3. 如何查看当前登录用户的信息?
在 Controller 中可以通过 Principal 参数获取:
@GetMapping("/user")
public String currentUser(Principal principal, Model model) {
model.addAttribute("username", principal.getName());
return "user_info";
}
❓4. Spring Security 是否支持手机号验证码登录?
当然可以,但目前是基于表单的密码登录。后续我们可以通过自定义 Filter 来实现短信验证码登录,属于进阶内容。
学习建议:下一步该学什么?
恭喜你完成了第一个 Spring Security 示例!接下来的学习路径建议如下:
🔹1. 更多的认证方式
- 数据库存储用户信息(如 JDBC + MySQL)
- OAuth2 第三方登录(微信、QQ 登录)
- JWT Token 验证(前后端分离场景)
🔹2. 安全防护加强
- 防止跨站请求伪造(CSRF)
- 防止暴力破解(尝试次数限制)
- 登录记录日志
🔹3. 综合实战
- 搭建一个完整的后台管理系统
- 实现 RBAC(基于角色的访问控制)
- 权限动态配置(数据库管理角色权限)
📚 推荐资料
- Spring Security 官方文档(中文翻译)
- Bilibili 上免费的 Spring Security 教程视频
- GitHub 上开源的小型管理后台项目练手
总结
本文通过通俗的语言与丰富的代码示例,带你一步步构建了一个简单的 Spring Security 安全系统。从环境搭建到核心概念解析,再到真实项目的搭建,最后还有 FAQ 和学习建议,相信你现在已经对 Spring Security 有了基本的理解。
记住一句话:安全不是终点,而是持续改进的过程。希望你在以后的学习中,能够不断拓展知识边界,打造更安全的 Web 系统。加油!💪

评论 0