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

在现代软件开发中,安全问题是绕不开的一个核心课题。尤其是对于Web应用来说,如何保护用户的隐私数据、防止非法访问,是每一个开发者必须掌握的基本技能。
而 Spring Security,就是帮助我们快速实现这些安全功能的工具。
简单来说:
Spring Security 是一个用于构建安全性机制的Java库,它能够轻松地为我们的Spring项目(特别是Spring Boot项目)提供登录认证、权限控制、防攻击等能力。
你可以把它想象成一个“门卫”,它会检查每一位试图进入系统的用户身份,验证其是否有权限执行某个操作。比如:
- 用户是否已登录?
- 登录用户能否访问某个页面或API接口?
- 普通用户和管理员看到的内容是否不同?
接下来我们将从零开始,手把手带你看懂并使用Spring Security的核心功能,并完成一个简单的登录认证小项目。
环境准备:准备好你的开发环境

为了顺利进行本教程的学习,请确保你已经具备以下基本的Java开发环境配置。
1. Java运行环境
确保你安装了 JDK 1.8以上版本(推荐使用OpenJDK 11或17),可以通过命令行输入以下内容验证:
java -version
如果返回类似如下内容,说明Java已经安装成功:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment ...
如果没有安装,请前往 官网 下载合适的版本。
2. 构建工具:Maven或Gradle
本教程使用的是 Maven,这是目前使用最广泛的Java项目管理工具之一。请确认已安装好Maven环境:
mvn -v
3. IDE编辑器推荐
建议使用如 IntelliJ IDEA、Eclipse 或 VSCode 这样的IDE来编写代码。其中,IntelliJ IDEA 社区版对Spring生态支持非常好。
4. 创建一个新的Spring Boot项目
我们可以使用 Spring Initializr 来快速生成一个Spring Boot项目模板:
- Project: Maven
- Language: Java
- Spring Boot Version: 例如 3.2.x
- Dependencies:
- Spring Web(用来构建Web应用)
- Spring Security(重点要学习的内容)
点击 “Generate” 按钮下载后解压文件,导入到你的IDE中即可开始编写Spring Security程序。
核心概念通俗讲解

在正式写代码之前,先让我们理解几个Spring Security中的关键角色和术语。
1. 认证(Authentication)
可以理解为:“你是谁?”
也就是系统要确认当前用户的身份。常见的做法比如用户名密码登录。
在Spring Security中,会通过 Authentication 对象来进行这一过程。
2. 授权(Authorization)
意思是:“你能做什么?”
当用户被认证之后,判断这个用户有没有权限访问某资源或操作。
这通常与“角色(Role)”有关,比如有管理员、普通用户等不同的角色,对应不同的权限。
3. 安全过滤链(Security Filter Chain)
它是Spring Security 的核心机制,是一系列拦截请求的“关卡”。
每个请求都需要经过一系列的安全处理流程,比如判断是否已经登录、是否有权限访问某些资源等。
4. 用户详情服务(UserDetailsService)
这是Spring Security提供的一个接口,用于获取用户的信息(比如用户名、密码、角色等)。如果你自己定义用户来源(如数据库查询),你需要实现这个接口。
5. 配置类(SecurityConfig)
这是一个普通的Java配置类,用于告诉Spring Security应该如何保护你的应用程序。在这里你可以设置登录页、密码策略、放行哪些资源等等。
实战项目:跟着我一步一步搭建安全认证系统

现在我们要做一个非常简单的安全认证系统,包含两个部分:
- 一个登录页面。
- 只有登录用户才能访问
/hello页面。 - 不同用户角色可以访问不同页面。
整个项目的最终目录结构大致如下:
├── HelloApplication.java // 主启动类
├── config/
│ └── SecurityConfig.java // 安全配置
├── controller/
│ └── HelloController.java // 控制器
└── user/
└── InMemoryUserService.java // 用户信息加载类
下面分步骤进行编码实现。
步骤一:创建控制器,测试基本页面
新建一个 HelloController.java 文件在 controller 包下:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "你好,只有登录用户才能看到这句话!";
}
}
此时,直接访问 http://localhost:8080/hello 可以看到文字,但没有安全控制。
步骤二:添加Security依赖(已经加过可跳过)
在你的 pom.xml 文件中应该能看到如下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入此依赖后,Spring Boot 默认就会开启Spring Security,并自动生成一个默认的登录页面和安全规则。
步骤三:自定义安全配置类
新建一个 SecurityConfig.java 在 config 包下:
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.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 users() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER") // 角色为 USER
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN") // 角色为 ADMIN
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// 安全规则定义
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").authenticated() // /hello 必须登录才能访问
.anyRequest().permitAll() // 其他请求无需登录也能访问
)
.formLogin(login -> login
.loginPage("/login") // 自定义登录页面地址
.defaultSuccessUrl("/hello") // 登录成功跳转路径
.permitAll() // 登录页面允许所有人访问
)
.logout(logout -> logout
.permitAll() // 注销功能允许所有人访问
);
return http.build();
}
}
⚠️ 特别提示:withDefaultPasswordEncoder() 方法是为了方便初学者练习时加密明文密码,不建议在生产环境使用,因为它采用的是已经被淘汰的加密算法。
步骤四:添加登录页面(可选)
虽然Spring Security会自动为我们生成一个登录页面,但如果想要自定义一个HTML界面也很简单。这里我们不深入HTML前端细节,只展示一个示例。
在 resources/templates 目录下新建 login.html:
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h2>欢迎登录</h2>
<form method="post" action="/login">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<button type="submit">登录</button>
</form>
</body>
</html>
为了让该页面生效,需要启用 Thymeleaf 模板引擎,在 pom.xml 中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后重启服务器,访问 /login 就可以看到我们自定义的登录页面啦!
步骤五:测试不同角色访问不同资源(可选进阶)
我们可以扩展一下,让只有管理员可以访问 /admin 页面。
修改控制器
新增 /admin 路由:
@GetMapping("/admin")
public String adminOnly() {
return "管理员专属内容";
}
修改配置类中的权限规则
修改 filterChain 方法:
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").hasAnyRole("USER", "ADMIN") // 允许两个角色访问
.requestMatchers("/admin").hasRole("ADMIN") // 仅允许 ADMIN 访问
.anyRequest().permitAll()
);
这样,当你以普通用户登录,尝试访问 /admin 时,将看到403错误,提示无权访问。
常见问题FAQ
以下是初学Spring Security时常常遇到的问题,一起来看看怎么解决。
Q1:为什么访问 /hello 页面时跳转到了 /login ?
A:因为你设置了 .requestMatchers("/hello").authenticated(),表示必须登录才能访问。Spring Security检测未认证状态后,会自动重定向到默认的登录页面(或者你自定义的 /login 页面)。
Q2:登录失败怎么办?
A:常见原因包括:
- 用户不存在
- 密码错误
- 登录逻辑未正确配置 可以打开浏览器控制台查看具体返回的HTTP响应码,也可以查看后台日志输出。
Q3:我不想用Spring Security自带的登录页面怎么办?
A:很简单,只需要像我们在第4步做的那样,自定义一个登录页面并通过配置类指定路径。
formLogin(login -> login.loginPage("/login"))
同时保证你的 /login 路由有效。
Q4:我可以把用户存储到数据库吗?
A:当然可以!这就是实际项目中更常用的做法。后面我们会讲到如何整合数据库(如MySQL)、使用 MyBatis、JPA 来读取用户信息。
Q5:我忘了密码怎么办?
A:在开发阶段可以用硬编码的方式改掉用户密码。在实际产品中需要设计“找回密码”的业务流程,甚至可能集成第三方登录(如微信登录、OAuth2等)。
学习建议:下一步可以学什么?
恭喜你完成了Spring Security的第一个实战项目!接下来,你可以在以下几个方向继续提升:
✅ 拓展知识点清单
| 技术主题 | 简介 |
|---|---|
| 数据库存储用户信息 | 从数据库加载用户,而不是内存 |
| 使用BCrypt加密密码 | 更安全的密码存储方式 |
| 角色继承与权限模型设计 | 系统更复杂时如何组织角色 |
| OAuth2和单点登录 | 支持微信、QQ、GitHub登录 |
| JWT令牌验证 | 适用于移动端或前后端分离的场景 |
✅ 推荐学习资源
- 📘《Spring Security实战》——适合有一定基础的同学。
- 🎥 B站视频:Spring Security入门+实战系列
- 👩💻 官网文档:https://docs.spring.io/spring-security/docs/current/reference/html5/
总结
在本文中,我们从零开始了解了Spring Security的基本用途,介绍了其核心概念,并一步步搭建了一个具有登录验证功能的小型安全系统。希望你能从中获得清晰的认知和实践能力。
记住一句话:
技术不怕慢,就怕停。
不要因为刚开始看不太懂就放弃,多动手、多思考、多问问题,你会越来越上手。继续加油吧!🌱
如有疑问,欢迎留言交流或私信提问,我会尽力为你解答。祝你一路顺风,早日成为后端安全高手!💪

评论 0