Spring Security基础:快速搭建安全认证系统
开篇:认识Spring Security

如果你正在学习Java后端开发,那么你一定听说过Spring框架。而Spring Security就是这个大家族中的一员,专门用于构建安全、可信赖的Web应用。
简单来说,Spring Security是一个基于Spring框架的安全模块,它可以帮助开发者在应用中快速实现登录认证、权限控制、防攻击等常见的安全功能。
举个最简单的例子:
你想做一个后台管理系统的登录页面。没有安全模块时,你需要自己写代码处理用户输入的账号密码、存储密码、验证身份……一旦考虑不周,就可能带来严重的安全隐患。但有了Spring Security之后,这些繁琐又关键的工作就可以交给它来完成,而且默认是安全的。
所以,无论你是想开发企业级项目,还是个人博客,掌握Spring Security都是非常有必要的技能。
环境准备:搭建开发环境

在动手实践前,我们需要准备好开发环境。下面是一个新手友好的步骤指南:
1. 安装Java环境(JDK)
- 推荐使用 JDK 17 或以上版本。
- 下载地址:https://adoptium.net
- 安装完成后,打开终端或命令行工具,运行以下命令确认是否安装成功:
java -version
javac -version
2. 安装IDE(推荐IntelliJ IDEA)
- 下载地址:https://www.jetbrains.com/idea/download/
- 推荐使用社区版(Community Edition),免费且足够使用。
3. 安装Maven(项目依赖管理工具)
- 大多数Spring Boot项目都使用Maven管理依赖包。
- 下载地址:https://maven.apache.org/download.cgi
- 配置环境变量,并检查是否安装成功:
mvn -v
4. 创建Spring Boot项目
有两种方式:
✅ 使用 Spring Initializr
- 访问上面链接
- 填写项目信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 推荐 3.x
- 添加依赖:
- Spring Web
- Spring Security
- 点击【Generate】下载项目压缩包
✅ 或者用IDEA创建
- 打开IntelliJ IDEA → New Project → Spring Initializr
- 同样选择对应的版本和添加Spring Security依赖
解压并导入项目到IDE中,等待依赖下载完成。
核心概念:理解几个重要术语
在开始编码前,我们先了解一些Spring Security的核心概念,这样你不会在配置时“看天书”。
1. 用户认证(Authentication)
用户认证指的是判断一个人是谁的过程。例如:
- 你访问网页需要输入用户名和密码
- 系统验证无误后,才允许你进行下一步操作
Spring Security提供了一些方式让我们方便地配置用户登录功能。
2. 权限控制(Authorization)
认证只是第一步,授权则是决定“这个人能不能做某件事”。比如:
- 普通用户只能查看内容
- 管理员可以修改删除内容
我们可以为不同的角色分配不同权限。
3. 过滤器链(Filter Chain)
请求进入服务器之前,会经过一道道过滤器,像安检门一样一层层检查是否符合安全要求。Spring Security底层就是通过这种方式来保护你的网站。
4. CSRF/XSS防护机制
Spring Security默认启用了多种安全防护机制,比如防止跨站请求伪造(CSRF)、防御脚本注入(XSS)等等。
👉 这些细节现在不需要深入了解,只需知道它们是自动启用的,能为你保驾护航!
实战项目:从零开始构建一个带登录页的网站
我们将一步步建立一个简单的Web项目,并让它拥有基本的用户登录和权限控制功能。
第一步:创建Spring Boot项目结构
刚才我们已经通过Spring Initializr创建了项目。项目结构大致如下:
demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com.example.demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ ├── security/
│ │ │ └── config/
│ │ └── resources/
│ │ ├── static/
│ │ ├── templates/
│ │ └── application.properties
说明:
controller放控制器类,处理页面请求config放配置文件,比如Security配置security可以放自定义用户服务等
第二步:添加静态页面与欢迎页
在 src/main/resources/templates/ 目录下新建两个HTML文件(使用Thymeleaf模板):
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>首页</title>
</head>
<body>
<h2 th:text="'欢迎 '+${#authentication.name}">游客你好!</h2>
<p>这是受保护的主页。</p>
<form th:action="@{/logout}" method="post">
<input type="submit" value="退出">
</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录页</title>
</head>
<body>
<h2>请登录</h2>
<form th:action="@{/login}" method="post">
<div>
<label>用户名:</label>
<input type="text" name="username"/>
</div>
<div>
<label>密码:</label>
<input type="password" name="password"/>
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
第三步:创建控制器

在 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("/")
public String home() {
return "index"; // 返回index.html模板
}
@GetMapping("/login")
public String loginPage() {
return "login";
}
}
第四步:配置Spring Security
新建 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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/login").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/", true)
.permitAll()
)
.logout(logout -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/")
);
return filterChain.build();
}
@Bean
public UserDetailsService userDetailsService() {
var user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
解释一下这段配置:
authorizeHttpRequests():设置哪些页面允许访问、哪些需要认证formLogin():开启表单登录模式,并指定跳转的登录页logout():支持登出,清除登录状态userDetailsService():临时在内存里添加一个用户(用户名user,密码123456)
第五步:测试运行
运行项目主类 DemoApplication.java。
打开浏览器访问:http://localhost:8080/ → 页面会自动跳转到登录页。
输入用户名:user,密码:123456 → 登录成功后回到首页。
点击“退出”按钮即可注销。
常见问题解答

以下是很多初学者常遇到的问题,希望能帮你提前避坑👇
❓1. 为什么输入正确的用户名密码却无法登录?
✅ 可能原因:
- 密码加密方式没正确使用(如忘记加
.withDefaultPasswordEncoder()) - 表单提交的字段名不是
username和password - 请求URL错误(注意大小写、斜杠)
🔍 解决方法:
- 确保登录页面使用POST方式提交
- 在Spring Security配置中打印日志调试(可通过
logging.level.org.springframework.security=DEBUG激活详细日志) - 检查控制台输出是否有异常提示
❓2. 为什么登录成功后不能跳转到主页?
✅ 可能原因:
- 没有配置
defaultSuccessUrl("/", true) - 主页路径不存在或未被允许访问
- Thymeleaf模板名称拼写错误
🔧 解法:
- 检查
@GetMapping("/")是否正确绑定Controller - 查看模板是否存在、名称是否一致(包括后缀.html)
- 可以尝试直接访问主页:
http://localhost:8080/看能否看到页面内容
❓3. 我如何注册多个用户?
你可以像这样扩展 userDetailsService() 方法:
@Bean
public UserDetailsService userDetailsService() {
var user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
var admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
学习建议:下一步怎么走?
恭喜你完成了第一个安全认证系统!
接下来你可以按以下路线继续学习更高级的内容:
| 学习方向 | 内容概述 |
|---|---|
| 自定义登录页样式 | 修改登录页外观,使用Bootstrap、CSS美化页面 |
| 用户数据持久化 | 学会将用户存在数据库中(如MySQL + JPA) |
| 角色与权限管理 | 设置不同角色之间的访问限制(例如USER只能读取、ADMIN可编辑) |
| OAuth2集成 | 接入微信、QQ、Google等第三方登录 |
| JWT Token鉴权 | 学习前后端分离中使用的Token认证方式 |
| 安全增强技巧 | 学习验证码、多因素认证、锁定账户等功能 |
📚 推荐资料:
- Spring官方文档:https://docs.spring.io/spring-security/site/docs/current/reference/html5/
- B站课程搜索:「Spring Security 入门」
- GitHub开源项目参考(GitHub搜索关键词“springboot login example”)
总结
在这篇教程中,我们从零开始一步步搭建了一个带有登录功能的Spring Boot项目,并用到了Spring Security的基础功能。
虽然我们还没有深入讲太多复杂内容,但这已经为你打开了通向Web安全的大门。只要你坚持练习,不断提问和总结,很快你就能掌握更多高级技能。
记住一句话:安全是所有Web项目的基石,越早掌握,越不吃亏。
如果你喜欢这样的教程风格,请持续关注后续系列文章《Spring Security进阶》《Spring Boot整合数据库实战》《RESTful API权限设计详解》等内容。
🎯 动手才是硬道理:快去试试自己搭建一个属于自己的安全登录系统吧!

评论 0