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

你可能已经听说过“Spring Boot”,它是用来开发 Java 后端服务的一个流行框架。而 Spring Security,则是 Spring 家族中专门负责“权限控制和安全验证”的工具。简单来说,它能帮你轻松实现:
- 登录认证(用户登录后才能访问某些页面)
- 权限管理(不同角色能看到或操作不同的内容)
- 防止常见攻击(如 CSRF 攻击)
不管你是做一个博客系统、电商网站还是企业管理系统,只要涉及到“谁可以看,谁不能看”,都需要用到 Spring Security。
二、环境准备


1. 开发工具安装
为了顺利学习本教程,你需要准备好以下软件环境:
(1)Java JDK
推荐使用 JDK 17 或更高版本。可以从官网下载:
👉 https://www.oracle.com/java/technologies/javase-jdk17-downloads.html
安装完成后,在终端输入命令查看是否安装成功:
java -version
javac -version
(2)IDE(集成开发环境)
推荐使用 IntelliJ IDEA 或 Eclipse,本文以 IntelliJ IDEA 社区版为例。
下载地址:https://www.jetbrains.com/idea/download/
(3)Maven 构建工具
Spring Security 是基于 Maven 的项目管理工具。你可以通过以下方式确认:
mvn --version
如果没有安装,可以通过下面的链接下载安装: https://maven.apache.org/download.cgi
2. 创建 Spring Boot 项目
现在我们来创建一个新的 Spring Boot 项目:
方法一:使用 start.spring.io
- 访问网址:start.spring.io
- 配置如下:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(比如 3.1.x)
- Group: com.example
- Artifact: security-demo
- Dependencies:
- Spring Web
- Spring Security

然后点击 “Generate” 下载项目压缩包,解压后导入 IDE 即可。
方法二:在 IntelliJ 中直接新建 Spring Initializr 项目
选择 File -> New -> Project -> Spring Initializr,然后同样添加依赖即可。
三、Spring Security 核心概念讲解(新手友好版)
我们用最通俗的方式讲解几个重要的核心概念:
1. 用户认证(Authentication)
就是判断“你是谁”。比如你在登录页面输入用户名和密码,系统会检查是否匹配数据库中的记录。如果匹配成功,就认为你“合法”。
举个生活例子:你进小区的时候要刷门禁卡。这就是“认证”的过程。
2. 授权(Authorization)
就是判断“你能做什么”。即使你进门了,也不一定能看到保安室或者机房。这些“权限”是不一样的。
再举例:学生可以查自己的成绩,老师可以看到全班的成绩,管理员可以修改成绩——这叫权限分级。
3. 用户角色(Role)
角色就是一个分类标签。比如:
- 角色
ROLE_USER:普通用户 - 角色
ROLE_ADMIN:管理员
你可以理解为一种“通行证”。拥有哪些角色,就能访问哪些资源。
4. 安全过滤器链(Security Filter Chain)
这是 Spring Security 处理请求的安全流程机制。我们可以把它理解成“安检门”,所有进入系统的请求都要经过它一层层检查,比如:是否登录、是否有权限等。
四、实战项目:从零开始搭建一个安全系统
我们来写一个非常简单的 Spring Boot + Spring Security 应用,包含两个接口:
/hello:所有人都可以访问/admin:只有管理员才能访问
第一步:导入 Spring Security 依赖
打开 pom.xml 文件,确保包含如下依赖(如果使用 start.spring.io 创建项目,默认就会加上):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步:编写控制器类
新建一个 Controller 类:HelloController.java
package com.example.securitydemo.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 "欢迎访问公开页面!";
}
@GetMapping("/admin")
public String adminOnly() {
return "欢迎进入管理员页面!";
}
}
第三步:配置安全规则
接下来我们要告诉 Spring Security,哪些人可以访问哪些页面。
新建一个类:SecurityConfig.java
package com.example.securitydemo.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 userDetailsService() {
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 filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers("/hello").permitAll() // 允许所有人访问
.requestMatchers("/admin").hasRole("ADMIN") // 只有管理员可以访问
.anyRequest().authenticated() // 其他路径必须登录
)
.formLogin(); // 使用默认登录页(自动生成一个登录界面)
return http.build();
}
}
第四步:运行并测试程序
启动你的 Spring Boot 程序,然后打开浏览器访问:
访问公开接口:http://localhost:8080/hello
👉 不需要登录就可以看到内容访问私有接口:http://localhost:8080/admin
👉 会跳转到自动提供的登录页面
尝试使用下面这两个用户:
| 用户名 | 密码 | 角色 |
|---|---|---|
| user | 123456 | USER |
| admin | admin123 | ADMIN |
试着用普通用户登录看看能不能访问 /admin 页面?
👉 应该会提示没有权限 —— 这说明我们的权限控制生效啦!
五、新手常见问题解答(FAQ)
Q1:为什么每次启动 Spring Security 都有随机生成的密码?
当你引入了 Spring Security,并没有设置自己的用户时,Spring Boot 会自动生成一个默认用户(用户名为 user),并在启动日志中打印出临时密码,例如:
Using generated security password: abcdef123456
这是为了防止你忘记设置安全密码。建议自己定义好用户。
Q2:我设置了用户,但为什么登录不了?
常见原因如下:
✅ 是否把用户名或密码输错了?
✅ 是否没有加 .withDefaultPasswordEncoder()?
✅ 是否配置了正确的 Role?比如是不是写成了小写的 "user",而配置里用的是 "USER"(大小写敏感!)
Q3:为什么访问 /admin 没弹出登录页?而是报错 403 Forbidden?
可能是你没有加上 .formLogin() 配置。这个方法的作用就是启用一个默认的登录页面。
Q4:我可以不设置密码吗?
不可以。Spring Security 要求每个用户都必须设置密码。哪怕你使用第三方登录(如微信),内部也需要一个唯一标识符和凭证。
Q5:为什么说 .withDefaultPasswordEncoder() 不推荐生产使用?
因为这个方法使用的是明文加密算法(SHA-256),安全性不够高。在正式项目中,建议使用更安全的加密方式,比如 BCryptPasswordEncoder(我们后面会讲)。
六、学习建议(下一步学什么?)
恭喜你完成了第一个 Spring Security 小项目!你现在已经是初学者的佼佼者了 😄
如果你还想深入掌握 Spring Security,建议后续学习以下方向:
🔹 第一步:理解表单登录与注销机制
- 学习如何自定义登录页面
- 实现记住我功能
- 实现注销功能
🔹 第二步:使用数据库存储用户信息
目前我们用的是内存中的用户数据,真实项目要用数据库。可以学习使用:
- Spring Data JPA + MySQL
- 自定义 UserDetailsService
🔹 第三步:学习 JWT(无状态鉴权)
适用于前后端分离项目,如 Vue + Spring Boot。 了解什么是 token、JWT 原理、如何结合 Spring Security 使用。
🔹 第四步:学习 OAuth2(第三方登录)
比如 GitHub、QQ、微信登录,都是基于 OAuth2 协议实现的,这也是很多大厂项目的标准做法。
总结一下
在这篇教程中,我们一起完成了以下任务:
- 了解了什么是 Spring Security 以及它的作用
- 配置好了开发环境
- 理解了认证、授权、角色等基本概念
- 写了一个支持用户登录和权限控制的小程序
- 解决了一些常见的新人问题
- 明确了后续学习路线
下一次课程,我们将会一起学习【如何连接数据库做真正的用户登录系统】,敬请期待!

评论 0