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

如果你正在学习Java后端开发,那你一定会遇到一个非常重要的模块——权限控制(Security)。简单来说,就是决定哪些人能访问你的网站/系统里的哪些资源。
比如你做了一个博客平台,只有登录用户才能写文章,而未登录用户只能看文章,这就是权限控制的一种体现。
Spring Security 就是 Spring 框架中专门处理这类权限控制的组件,它可以帮你:
- 实现登录、注册功能
- 控制不同角色(例如:普通用户、管理员)的访问权限
- 防止常见安全攻击,如跨站请求伪造(CSRF)、暴力破解等
它的目标不是让你成为网络安全专家,而是让你用最简单的方式快速构建起一个安全可控的后端系统。
环境准备:从零开始搭建开发环境

在正式学习之前,我们需要准备好以下工具和依赖:
1. 安装JDK(Java Development Kit)
确保你安装了 JDK 17 或更高版本。你可以通过命令行输入下面这句命令来查看:
java -version
如果没有安装,可以到官网下载安装包(推荐 Oracle JDK 或 OpenJDK)。
2. 安装IDE(推荐 IntelliJ IDEA)
IntelliJ IDEA 是一个强大的 Java 开发工具,社区版免费,对初学者友好。下载地址: 🔗 https://www.jetbrains.com/idea/download/
3. 创建Spring Boot项目
打开浏览器,访问 https://start.spring.io,创建一个新的 Spring Boot 项目。
选择以下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 3.x(或稳定版本)
- Dependencies:
- Spring Web
- Spring Security
- Thymeleaf (可选,用于网页展示)
- H2 Database (内存数据库,方便测试)
点击 Generate 下载并解压项目文件,然后用 IntelliJ IDEA 打开该项目。
现在我们已经准备好了所有环境,接下来就可以正式进入 Spring Security 的学习啦!
核心概念:理解几个重要名词
1. 用户(User)
用户是指使用你系统的访问者。他们可能包括:
- 普通访客(未登录)
- 登录的用户(如张三、李四)
- 管理员(具有更高权限的人)
2. 角色(Role)
角色是对用户的分类。比如:
- ROLE_USER(普通用户)
- ROLE_ADMIN(管理员)
这些角色会影响他们是否能访问某些接口,例如,管理员才可以访问删除文章的功能。
3. 权限(Authority)
权限比角色更细,表示某个用户是否有能力执行某项操作。比如:
- read_article(读文章)
- write_article(写文章)
权限机制通常用于更细粒度的控制(我们会在以后的进阶教程中学到)。
4. 身份验证(Authentication)
这是“你是谁”的问题。当用户输入用户名和密码后,系统要确认他们的身份是否正确。
5. 授权(Authorization)
这是“你能干什么”的问题。确认身份之后,再判断这个用户是否有权限访问某个资源或执行某个操作。
我们可以把它们想象成现实生活中的“刷卡进门”过程:
- 刷卡是身份验证(系统识别你是谁)
- 卡片对应的门禁权限是授权(你只能进哪些门)
实战项目:一步步实现一个简单的安全系统
下面我们来做一个小项目:创建一个 Spring Boot 应用,允许访问 /home 页面,但必须登录后才能访问 /admin 页面。
第一步:添加依赖
我们在前面已经通过 Spring Initializr 添加了 Spring Security 和 Spring Web,所以这一步其实已经完成。检查 pom.xml 文件,应该能看到如下内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
第二步:创建简单的页面控制器
在 src/main/java/com.example.demo.controller 目录下新建一个控制器类 HomeController.java:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/home")
public String home() {
return "home"; // 返回 home.html 页面
}
@GetMapping("/admin")
public String admin() {
return "admin";
}
}
同时,在 src/main/resources/templates 目录下,创建两个 HTML 页面:
home.html内容如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>主页</title>
</head>
<body>
<h1>欢迎来到主页</h1>
<p>这是一个所有人都可以看到的页面。</p>
</body>
</html>
admin.html内容如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>管理员页面</title>
</head>
<body>
<h1>欢迎,管理员!</h1>
<p>这是管理员专用页面。</p>
</body>
</html>
第三步:配置Spring Security
新建一个配置类来启用安全控制。在 src/main/java/com.example.demo.config 目录下创建 SecurityConfig.java:
package com.example.demo.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.config.annotation.web.configuration.EnableWebSecurity;
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
@EnableWebSecurity
public class SecurityConfig {
@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("/home").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
上面这段代码做了几件事:
- 使用
InMemoryUserDetailsManager在内存中定义两个用户(user和admin) - 对 URL 进行权限控制:
/home:所有人都可以访问/admin:必须是 ADMIN 角色的用户才可访问
- 启用了基于表单的登录页面,并指定登录页面为
/login - 支持注销登录(logout)
⚠️ 注意:为了简化教学,这里用了明文密码 +
withDefaultPasswordEncoder()。这种做法在生产环境中不推荐使用,后续我们再讲如何加密存储密码。
第四步:创建登录页面
还是在 templates 目录下,新建一个 login.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录页面</title>
</head>
<body>
<h1>请登录</h1>
<form th:action="@{/login}" method="post">
<div>
<label>用户名:<input type="text" name="username"/></label>
</div>
<div>
<label>密码:<input type="password" name="password"/></label>
</div>
<button type="submit">登录</button>
</form>
</body>
</html>
📌 提示:Spring Security 默认使用 POST 方法处理
/login请求,所以我们必须用<form>表单提交方式。
第五步:运行项目并测试
启动应用后,在浏览器中访问以下链接进行测试:
- 访问
http://localhost:8080/home:无需登录即可访问 - 访问
http://localhost:8080/admin:会跳转到登录页 - 输入用户名
admin,密码admin123成功进入管理员页面
是不是很简单?我们现在已经有了一个带登录认证的安全应用。
常见问题解答(FAQ)

Q1:为什么我一访问 /admin 就报错或跳转不了?
可能原因:
- 没有定义
/login路由- 确保你创建了
login.html页面,并且路径正确
- 确保你创建了
- 未配置 formLogin
- 确认你在 SecurityConfig 中调用了
.formLogin()方法
- 确认你在 SecurityConfig 中调用了
- URL 匹配错误
- 检查
requestMatchers("/admin")是否拼写正确
- 检查
Q2:为什么无法登录成功?一直提示用户名或密码错误?
请检查:
- 用户名和密码是否正确(本例中 admin / admin123)
- 是否误用了大小写(区分大小写的)
- 是否忘了设置密码编码器(本例中使用的是明文,非加密模式)
⚠️ 更安全的做法是在生产环境使用 BCrypt 加密密码,我们将在进阶内容中讲解。
Q3:为什么不需要登录就能访问 /admin?
检查 SecurityConfig 中关于 URL 权限的配置部分:
.requestMatchers("/admin").hasRole("ADMIN")
是否有拼写错误?有没有忘记添加 .hasRole(...)?
Q4:能不能自定义登录失败后的跳转页面?
当然可以,修改配置如下:
.formLogin(login -> login
.loginPage("/login")
.failureUrl("/login-error")
.permitAll()
)
然后新建一个 login-error.html 页面即可。
学习建议:下一步学什么?
恭喜你完成了 Spring Security 的第一课!你已经掌握了最基础的身份认证机制。
接下来你可以继续深入以下几个方向:
1. 自定义用户存储
目前我们用的是内存用户管理器 InMemoryUserDetailsManager。下一步可以学习:
- 使用数据库(如 MySQL)保存用户信息
- 使用 JPA 或 MyBatis 实现用户认证
2. 使用BCrypt密码加密
了解现代密码存储的最佳实践:
- 为什么要用 BCrypt?
- 如何替换默认的明文密码策略?
3. 基于角色和权限的更复杂控制
目前我们只控制了路径级别访问权限,还可以做到:
- 方法级别的控制(@PreAuthorize 注解)
- 动态权限配置
- RBAC 模型的设计与实现
4. 整合第三方登录(OAuth2)
随着社交登录流行,可以尝试集成 GitHub、微信、Google 等平台的登录方式。
总结
本篇文章从零开始,介绍了 Spring Security 的基本概念,并通过一个简单的项目展示了如何搭建一个带有登录和权限控制的 Spring Boot 应用。
主要内容总结如下:
| 主题 | 内容简述 |
|---|---|
| 环境搭建 | 安装 JDK、IDE,创建 Spring Boot 项目 |
| 关键概念 | 用户、角色、权限、认证、授权 |
| 实战步骤 | 配置控制器、HTML 页面、安全策略 |
| 常见问题 | 登录失败、权限限制失效等问题排查方法 |
| 学习建议 | 数据库存储、密码加密、RBAC、OAuth2 |
希望你能动手跟着实践一遍。编程最好的方式就是多敲代码,不断犯错,不断解决。
下一节课我们将探讨如何用数据库实现用户登录,记得持续关注!
💡 如果你有任何问题或者想继续深入学习 Spring Security 的某个主题,请在评论区告诉我,我会根据大家反馈继续更新系列内容。

评论 0