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

你可能听说过“安全”这个词在软件开发中经常出现。比如网站登录、权限控制这些功能,其实就是程序的安全机制在起作用。
Spring Security 就是 Java 开发中最常用的一个安全框架,它能帮助我们:
- 实现用户登录功能(比如用户名密码验证)
- 控制页面访问权限(比如只有管理员才能看到某些页面)
- 防止常见的攻击(如跨站请求伪造 CSRF)
我们可以把它想象成一个“保安系统”,用来保护我们的 Web 应用不被非法访问。
今天我们就来一步步用 Spring Security 搭建一个简单的安全认证系统!
环境准备:搭建开发环境

所需工具
| 工具 | 说明 |
|---|---|
| JDK 17+ | Java 开发环境 |
| Maven | 项目依赖管理工具 |
| IntelliJ IDEA(或其他IDE) | 推荐使用,也可以用 VSCode + Java 插件 |
| Spring Boot 3.x | Spring Security 的运行环境 |
✅ 建议使用 Spring Initializr 快速创建项目
官网地址:https://start.spring.io/
创建 Spring Boot 项目步骤:
- 打开上面的链接
- 填写如下信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(如 3.2.x)
- Dependencies:
- Spring Web
- Spring Security
- Thymeleaf(用于前端展示)
- 点击
Generate下载压缩包并解压 - 导入项目到 IDE 中,等待 Maven 自动下载依赖
完成后你的项目结构大致如下:
src
├── main
│ ├── java
│ │ └── com.example.demo
│ │ ├── DemoApplication.java
│ │ └── config/(后续添加配置类)
│ ├── resources
│ ├── static/
│ ├── templates/
│ └── application.properties
核心概念:认识几个重要概念

为了更轻松地理解 Spring Security,先了解这几个关键词。
1. 认证(Authentication)
认证就是确认你是谁的过程。比如用户输入用户名和密码进行登录,这一步就是在做“认证”。
2. 授权(Authorization)
授权是决定你能不能做什么事情。比如有些页面只有管理员可以访问,普通用户不能看,这就是“授权”的体现。
3. SecurityFilterChain
这是 Spring Security 中一个非常重要的组件,它就像一扇门,所有进入网站的请求都会经过它。你可以在这里设置哪些请求需要登录、哪些不需要。
4. UserDetailsService
这是 Spring Security 提供的一个接口,用于从数据库或内存中加载用户信息,用于登录验证。
5. BCryptPasswordEncoder
这是一个加密工具,用来安全地存储用户的密码,防止泄露。
实战项目:一步一步搭建安全认证系统
我们将实现以下功能:
- 访问首页
/不需要登录 - 访问
/admin页面必须登录且具有 ADMIN 权限 - 支持用户名密码登录
Step 1:编写基本网页模板
在 resources/templates 文件夹下新建两个 HTML 文件:
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎来到首页!</h1>
<p><a href="/admin">前往后台管理页面</a></p>
<p><a href="/login">登录</a></p>
</body>
</html>
admin.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>管理页</title>
</head>
<body>
<h1>这里是管理员页面!</h1>
<a href="/logout">退出登录</a>
</body>
</html>
Step 2:编写控制器(Controller)
在 DemoApplication.java 同级目录下新建 HomeController.java:
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index";
}
@GetMapping("/admin")
public String admin() {
return "admin";
}
}
现在启动项目,浏览器访问 http://localhost:8080,能看到主页内容。
不过目前还没加任何安全控制,所有人都能直接访问 /admin。
接下来重点来了——我们要加入 Spring Security 的安全控制!
Step 3:配置安全策略(SecurityFilterChain)
在项目根包下新建包 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 securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/login").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login") // 我们没有这个页面,可以用默认的
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
}
这段代码做了几件事:
- 在内存中定义了两个用户:user 和 admin,分别有 USER 和 ADMIN 角色。
- 配置了访问权限:
/和/login不需要登录就可以访问。/admin必须有 ADMIN 角色才能访问。- 其他路径都需要登录。
- 开启了表单登录和注销功能。
Step 4:测试登录效果
重启项目后:
- 访问 http://localhost:8080/admin
- 系统会跳转到登录界面(Spring Security 默认提供了),输入用户名
admin和密码admin123 - 登录成功后,就可以看到管理员页面
💡 如果你想自定义登录页面(比如自己写个 login.html),只需要把
/login路径指向自己的页面即可。
常见问题解答
❓为什么我输入正确的用户名密码还会提示登录失败?
可能原因:
- 密码加密方式错误。确保调用了
.withDefaultPasswordEncoder()方法。 - 使用了
.hasAuthority()检查的是权限名而不是角色名(角色名前面自动加ROLE_)。
❓我想让所有人访问 /about 页面怎么办?
修改配置中的 .requestMatchers(...) 即可:
.requestMatchers("/about").permitAll()
❓如何让访问 /api/** 的请求都走无状态 JWT 验证?
这个属于进阶内容,我们以后再讲。目前建议先掌握基于 session 的安全机制。
❓能否把用户存在数据库里?
当然可以!我们上面用的是内存中的用户。之后可以通过集成数据库,比如 MySQL,来支持用户持久化。
学习建议:下一步该学什么?
恭喜你完成了第一个安全认证系统的搭建!下一步建议继续学习:
进阶知识点清单:
- 【必学】自定义登录页面
- 【必学】基于数据库的用户认证
- 【选学】使用 JWT 替换 Session 实现无状态认证
- 【拓展】方法级别的权限控制(@PreAuthorize 注解)
- 【拓展】CSRF、XSS 等安全防护机制
- 【实战】整合 OAuth2 第三方登录(如微信、GitHub)
总结
本教程带你一步步搭建了一个简单的 Spring Security 安全系统。从零开始,完成了以下目标:
- 理解了 Spring Security 的基本概念
- 搭建了开发环境
- 实现了基础登录与权限控制
- 回答了新手常见问题
- 明确了下一步的学习方向
Spring Security 虽然一开始看起来复杂,但只要你坚持实践,很快就会上手。如果你觉得这篇文章对你有帮助,不妨收藏起来,作为学习安全认证的第一站!
继续加油,未来的安全高手就是你!🚀

评论 0