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

在开发Web应用时,你可能听说过“用户登录”、“权限控制”、“安全防护”等关键词。这些功能对于绝大多数网站或应用程序来说都是必不可少的。
Spring Security 就是这样一个帮助我们快速实现这些功能的工具包。它是一个由Spring官方提供的安全框架,专门用于保护我们的Java Web应用免受未经授权的访问和攻击。
你可以把它想象成一个自动门禁系统:
- 用户必须刷卡(登录)才能进入(访问页面)
- 不同级别的员工有不同权限(只能访问指定区域)
- 入口处有保安(拦截器)负责检查每个人的通行证
简单说,有了Spring Security,我们就不用自己从头造轮子去处理用户权限、密码加密、登录逻辑等问题了。
二、环境准备:开始之前,你需要准备好这些工具

在开始写代码之前,我们需要先搭好开发环境。这一部分适合完全没接触过Spring Boot的新手朋友。
1. 安装JDK(Java运行环境)
Spring Security基于Java开发,所以首先需要安装 JDK(Java Development Kit),推荐使用JDK 8或以上版本。
- 下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
- 安装完成后,打开终端输入以下命令查看是否安装成功:
java -version
如果看到类似下面的信息,说明安装成功:
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment ...
2. 安装IDE(开发工具)
推荐使用免费且强大的 IDE —— IntelliJ IDEA Community Edition
- 下载地址:https://www.jetbrains.com/idea/download/
- 安装过程很简单,一路Next即可
3. 创建Spring Boot项目
我们使用 https://start.spring.io 快速生成一个空项目。
步骤如下:
- 打开网址 https://start.spring.io
- 填写以下信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 默认最新稳定版(如3.x)
- Group: com.example
- Artifact: demo-security
- Name: DemoSecurityApplication
- Description: A basic security project
- Packaging: Jar
- Java Version: 17(根据自己安装的JDK选择)
添加依赖(Dependencies):
- Spring Security
- Spring Web(用于创建网页)
点击【Generate】按钮下载项目压缩包
解压后用IDEA导入项目:
- 打开IDEA → File → New → Project from Existing Sources...
- 选择解压后的文件夹中
pom.xml文件 → Import as Maven Project
三、核心概念:Spring Security的几个关键词
为了方便理解,我们可以把Spring Security中的核心组件比作一栋楼里的安保系统。
1. 认证(Authentication)
相当于保安确认你是谁的过程,比如验证用户名和密码。
常用方式:
- 表单登录(用户名+密码)
- 第三方登录(QQ、微信)
- Token登录(如JWT)
2. 授权(Authorization)
确认你是否有权做某件事,比如访问某个网页、添加数据、修改信息。
比如:
- 普通用户看不到管理页面
- 管理员可以发布文章
3. 用户存储(User Details Service)
类似于公司人事部的员工档案管理系统,记录每个员工的信息。
Spring Security允许我们:
- 使用内存存储(测试用)
- 数据库存储(实际用)
4. 密码加密(PasswordEncoder)
密码不能明文保存,要加密之后存数据库。
Spring Security内置了常用的加密算法,比如 BCryptPasswordEncoder。
5. 安全配置类(SecurityConfig)
这是我们要编写的核心类,用来配置整个安全系统的行为,比如:
- 哪些页面需要登录才能访问
- 登录页长什么样
- 登出机制如何设置
四、实战项目:搭建一个简单的带登录的功能页面
现在我们来一步一步完成一个带有基本登录功能的小项目。
1. 创建Controller类
我们在 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("/")
public String home() {
return "index"; // 返回模板名称,需创建 index.html
}
}
2. 创建前端页面
Spring Boot默认使用Thymeleaf作为模板引擎,我们只需在资源目录下添加HTML文件即可。
创建文件:src/main/resources/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎来到首页!</h1>
<p><a href="/admin">前往管理页</a></p>
</body>
</html>
3. 创建管理页
再加一个管理页:src/main/resources/templates/admin.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>管理员页面</title>
</head>
<body>
<h1>管理员才可以看到的内容</h1>
</body>
</html>
4. 添加Spring Security配置类
接下来是最关键的部分:编写安全配置类。
在包路径下创建类 SecurityConfig.java:
package com.example.demo;
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 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("/").permitAll() // 首页所有人都可访问
.requestMatchers("/admin").hasRole("ADMIN") // /admin只允许ADMIN角色访问
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login") // 自定义登录页
.permitAll()
)
.logout((logout) -> logout
.permitAll()
);
return http.build();
}
}
这段代码做了几件事:
- 设置两个用户到内存中(user和admin)
- 规定
/路径不需要登录就能访问 - 规定
/admin页面只有管理员能访问 - 设置登录页面为
/login - 开启登出功能(后续会自动生成退出链接)
5. 创建登录页面
Spring Security默认没有提供登录页面,我们手动添加一个。
创建文件:src/main/resources/templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>登录页面</h1>
<form method="post" action="/login">
<label for="username">用户名:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit">登录</button>
</form>
</body>
</html>
6. 运行项目并测试
点击运行启动类 DemoSecurityApplication,启动项目。
访问 http://localhost:8080
- 点击“前往管理页”会被重定向到登录页
- 输入正确的用户名和密码即可进入管理页面
五、常见问题解答(FAQ)
Q1:为什么我输入了正确的账号密码却无法登录?
可能是密码加密的问题。Spring Security要求密码必须加密存储。如果你用的是 .withDefaultPasswordEncoder() 是没问题的。但建议后面改用更安全的 BCryptPasswordEncoder。
Q2:我不想用默认的登录页怎么办?
可以在配置类中使用 .loginPage("/custom-login") 并返回对应的页面。
Q3:如何让用户登录后记住我一段时间?
可以启用“记住我”功能,在配置类中加入:
.rememberMe(rem -> rem
.tokenValiditySeconds(86400) // 有效期24小时
.key("mySecretKey"))
Q4:怎么限制同时登录人数?
可以通过设置 session 策略实现。例如:
.sessionManagement(session -> session
.maximumSessions(1)
.maxSessionsPreventsLogin(true))
六、学习建议:下一步该学什么?
恭喜你完成了第一个Spring Security小项目!
接下来你还可以进一步深入以下几个方向:
✅ 推荐学习路径:
| 学习内容 | 用途 |
|---|---|
| 数据库集成 | 存储真实用户信息 |
| JWT认证 | 移动端或前后端分离项目常用 |
| OAuth2协议 | 支持第三方登录(如微信、GitHub) |
| RBAC权限模型 | 复杂项目的权限设计 |
| Spring Security + Vue/React整合 | 前后端分离的安全架构 |
| 方法级别权限控制 | 控制具体方法是否可被调用 |
结语
通过本文的学习,你应该已经掌握了Spring Security的基础知识,并能够独立搭建一个具备登录、权限控制的基本Web安全系统。
学习编程最有效的方式就是动手实践,建议你尝试自己重新敲一遍示例代码,并尝试做一些扩展,比如:
- 添加注册功能
- 修改页面样式
- 增加更多的用户角色和页面权限
坚持下去,你会越来越熟练掌握这套“Java世界的门禁系统”。
如果你觉得这个教程对你有帮助,也欢迎分享给其他刚入门的朋友一起学习!

评论 0