Spring Security基础:快速搭建安全认证系统(适合零基础)
一、开篇:我们为什么要学Spring Security?

在开发Web应用时,最常见也最重要的一个功能就是用户登录与权限控制。比如你开发了一个博客网站,不希望随便什么人都能发布文章;或者你想开发一个后台管理系统,只允许管理员访问某些页面。
那如何实现这个“谁可以访问”的功能呢?这就需要用到 Spring Security 这个框架。
简单来说:
Spring Security 是一个用于保护 Java Web 应用的安全框架。它可以帮助你实现诸如:
- 用户登录认证
- 权限管理(不同角色访问不同资源)
- 密码加密处理
- 防御常见的攻击方式(如CSRF)
今天我们就要从零开始,一起用Spring Security搭建一个简单的安全认证系统。
二、环境准备:准备好你的开发工具

要学习Spring Security,你需要有以下基础开发环境:
1. 安装JDK
- 推荐使用 JDK 8 或以上版本(JDK 17 更佳)
- 可以通过 Oracle官网 下载安装包
验证是否安装成功:
java -version
2. 安装IDE(集成开发环境)
推荐使用 IntelliJ IDEA 或者 Eclipse
下载地址:
- IntelliJ IDEA: https://www.jetbrains.com/idea/
- Eclipse: https://www.eclipse.org/downloads/
3. 创建Spring Boot项目
Spring Security 最方便的使用方式是基于 Spring Boot,我们可以用在线生成器快速创建项目:
配置如下:
- Project: Maven
- Language: Java
- Spring Boot Version: 任意当前稳定版本(如 3.0.x)
- Dependencies 添加:
- Spring Web
- Spring Security
点击 Generate 按钮下载项目压缩包,解压后导入到 IDE 中。
三、核心概念:搞懂几个关键术语

如果你之前没接触过安全相关的内容,这些词可能会让你一头雾水。别担心,我来用日常语言解释一下。
| 术语 | 通俗解释 |
|---|---|
| Authentication(认证) | 就是“你是谁”——验证用户身份的过程,例如:输入用户名和密码登录 |
| Authorization(授权) | 就是“你能做什么”——确定用户是否有权访问某个资源或执行某个操作 |
| Principal(主体) | 代表当前用户的信息,你可以理解为登录成功的用户对象 |
| Role / Authority(角色 / 权限) | 角色是指用户的类别(比如普通用户、管理员),权限是指具体的操作能力 |
| Security Context(安全上下文) | 保存当前用户的安全信息(比如身份、权限),供整个请求过程使用 |
小提示:
初学者先不用死记硬背这些概念,随着代码练习慢慢就会理解。
四、实战项目:一步步搭建你的第一个Spring Security程序
我们现在来做一个最基础的功能:创建一个登录页面,只有登录后的用户才能访问主页。
第一步:添加首页控制器
新建一个类叫 HomeController.java,内容如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
第二步:创建一个HTML页面(视图)
我们在 resources/templates 目录下创建一个叫 home.html 的页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>欢迎页</title>
</head>
<body>
<h1>恭喜!你已成功登录</h1>
</body>
</html>
第三步:开启Spring Security基本配置
创建一个Java类:SecurityConfig.java,内容如下:
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 SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login") // 登录页面路径
.permitAll()
);
return http.build();
}
// 创建一个内存中的用户(适合测试)
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
第四步:创建登录页面 login.html
在 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>
现在,启动项目,访问 http://localhost:8080/,你会发现自动跳转到了 /login 页面,输入用户名 user 和密码 123456 后就可以进入主页!
五、进阶实践:增加多个用户和角色权限

我们刚才只是用了一个人工配置的用户,实际项目中我们需要多用户支持。我们先来修改配置:
@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);
}
然后,我们再设置不同的访问权限:
比如,让只有拥有 ADMIN 角色的用户才能访问 /admin 路径:
@GetMapping("/admin")
public String admin() {
return "admin";
}
修改 SecurityConfig.java 中的权限配置:
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 主页所有人都可以访问
.requestMatchers("/admin").hasRole("ADMIN") // 只有管理员可以访问
.anyRequest().authenticated()
);
现在重启项目,测试访问 /admin 是否只有账号 admin 可以进去。
六、新手常遇到的问题及解决办法(FAQ)
❓问题1:为什么登录失败?
- 可能原因:
- 用户名或密码错误(大小写也要正确)
- 浏览器缓存了旧数据,尝试清除 cookie
- 登录表单提交的参数不是 username/password
🔍 解决方法:确保你的 <input> 标签 name 属性为 username 和 password。
❓问题2:为什么没有跳转到登录页?
- 常见情况:
- 忘记了在配置里设置
.formLogin()方法 - 没有在模板目录下放
login.html
- 忘记了在配置里设置
🔧 修复建议:检查 SecurityConfig 类的 .formLogin() 配置,并确认模板文件位置为 src/main/resources/templates/login.html
❓问题3:密码明明正确却提示认证失败?
- 如果你在Spring Boot 2.7+ 版本之后发现这个问题,请注意:
- Spring Security 不再默认接受纯文本密码
User.withDefaultPasswordEncoder()已被弃用,建议使用加密密码
🛠 推荐做法:
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
但正式项目应使用更安全的加密方式,如 BCrypt。
七、下一步学习建议
恭喜你完成了你的第一个Spring Security项目!接下来你可以继续深入学习以下方向:
✅ 扩展方向推荐:
| 学习主题 | 内容概述 |
|---|---|
| 数据库存储用户信息 | 学会将用户数据存储在MySQL等数据库中 |
| 使用BCrypt加密密码 | 安全地存储用户密码而不是明文 |
| OAuth2登录 | 集成微信、QQ等第三方登录 |
| JWT令牌认证 | 实现前后端分离的登录方案 |
| 方法级权限控制 | 控制某个方法只能由特定角色调用 |
🔁 推荐学习路线:
- 理解更多HTTP安全机制(如session、cookie)
- 学会使用 Thymeleaf 模板渲染动态内容
- 集成 MySQL 实现数据库用户登录
- 使用 Spring Data JPA 管理用户信息
- 进阶学习OAuth2、JWT、RBAC权限模型
八、总结回顾
这篇文章我们一起学习了:
✅ 如何创建Spring Security项目
✅ 如何配置登录页面
✅ 如何进行基本的身份验证
✅ 如何按角色控制访问权限
✅ 常见问题的排查方法
虽然这只是入门,但这一步非常重要。有了这个基础,你可以继续探索Spring Security的更多高级特性。
如果你坚持走完了这整个教程,那么你已经迈入了安全领域的第一道门。记住一句话:
“真正的安全,始于对基本原理的深刻理解。”
祝你编程之路越走越远!🌟

评论 0