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

如果你刚开始学习Java后端开发,你可能已经听说过Spring这个框架。而Spring Security是Spring家族中的一个重要组件,专门用来为我们的Web应用添加“安全防护”。你可以把它想象成给你的网站加了一扇门,这扇门只允许拥有合法“钥匙”(比如用户名和密码)的人进入。
简单来说,Spring Security可以帮你实现用户登录、权限控制、数据加密等功能。无论是做后台管理系统、电商网站还是社交平台,只要涉及用户的登录和权限管理,都需要用到它。
本教程将从零开始,带你一步步搭建一个带有基本安全认证功能的小项目,即使你是编程小白,也能轻松上手!
环境准备:搭建开发环境

在正式开始之前,我们需要准备好开发所需的工具和环境。以下是推荐的软件组合:
1. Java环境
确保你已经安装了Java 17或更高版本。可以通过命令行输入以下命令检查是否安装成功:
java -version
如果没装Java,请前往Oracle官网下载安装。
2. Maven构建工具
Maven是一个用来管理项目依赖(即第三方库)的工具,我们会在后续使用它来引入Spring Security相关库。
检查是否安装Maven:
mvn -v
没有的话可以从Maven官网下载并安装。
3. IDE(集成开发环境)
建议使用IntelliJ IDEA Community Edition(免费),它对Spring Boot的支持非常友好。当然,Eclipse也是可行的替代方案。
提示:IDEA社区版足够用于本教程的所有练习。
4. 创建一个Spring Boot项目
访问 https://start.spring.io,按照以下配置生成一个基础Spring Boot项目:
- Project: Maven
- Language: Java
- Spring Boot Version: 3.x(例如3.1.0)
- Group: com.example
- Artifact: secure-demo
- Dependencies:
- Spring Web
- Spring Security
点击 Generate 下载项目压缩包,并解压到本地文件夹中。
使用IDE导入项目,打开后你会看到标准的Spring Boot结构,类似这样:
src/
├── main/
│ ├── java/
│ │ └── com.example.securedemo/
│ │ ├── DemoApplication.java
│ │ └── controller/ (你可以在这里写控制器类)
│ └── resources/
│ └── application.properties
此时你就可以运行 DemoApplication 启动Spring Boot项目了,默认启动端口是8080。
核心概念:通俗讲解关键术语
在真正动手编码之前,先理解几个Spring Security中最核心的概念。

1. 用户(User)
指需要登录系统的普通用户。通常会存储他们的用户名和密码。
2. 认证(Authentication)
就是“验证用户身份”的过程。就像你在银行ATM取钱时插卡输密码的过程。
3. 授权(Authorization)
是指确定某个已登录用户能做什么事。比如管理员能看到所有内容,普通用户只能看到一部分。
4. 角色(Role)
角色是权限的一种分类方式。常见的有:ROLE_USER、ROLE_ADMIN等。
5. 安全策略(Security Config)
这部分是你编写规则的地方,用来告诉Spring Security:“哪些页面需要登录?哪些角色能访问哪些资源?”
这些概念听起来有点抽象,没关系!下面我们会通过具体例子逐步解释。
实战项目:跟着教程完成第一个安全系统
我们将创建一个简单的Spring Boot项目,实现以下功能:
- 用户访问
/hello页面,只有登录后才能查看 - 使用内存中的默认用户进行测试
第一步:添加Spring Security依赖
如果你是通过上面的方法用start.spring.io生成的项目,那Spring Security已经自动添加了依赖。
如果没有,请手动添加如下Maven依赖到 pom.xml 文件中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
保存后IDE会自动下载相关包。
第二步:编写一个简单的页面控制器
新建一个控制器类:HelloController.java,内容如下:
package com.example.securedemo.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 "欢迎来到安全世界!";
}
}
运行项目后,在浏览器中访问 http://localhost:8080/hello
你会发现页面自动跳转到了一个登录界面。
这是Spring Security自动为我们加上了保护机制——说明它已经生效了!
但这时还没有设置登录账号,Spring Security会自动生成一个默认的临时用户名密码,我们可以在控制台看到:
Using generated security password: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
记住这个密码,稍后再尝试登录。
第三步:配置自定义用户名密码(内存模式)
为了方便演示,我们可以直接在配置文件中定义一个用户。
修改 application.properties 文件,添加以下内容:
spring.security.user.name=admin
spring.security.user.password=123456
spring.security.user.roles=USER
重启项目,再次访问 /hello 页面,输入用户名 admin,密码 123456 即可成功访问。
⚠️ 注意:这种方式仅适用于测试,不适合生产环境。
第四步:配置访问权限
目前我们只是保护了整个项目的所有接口,我们希望更精细地控制。
例如,只有ADMIN角色的用户才可以访问 /admin 路径,而其他用户不能访问。
为此,我们需要编写一个配置类。
新建类 SecurityConfig.java:
package com.example.securedemo.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 {
// 配置两个用户,user 和 admin
@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", "USER") // 拥有两个角色
.build();

return new InMemoryUserDetailsManager(user, admin);
}
// 配置安全策略
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").hasRole("USER")
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login") // 可自定义登录页,这里暂不深入
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
现在重新启动项目,尝试访问:
- http://localhost:8080/hello → 登录用户都可以访问
- http://localhost:8080/admin → 只有
admin账号可以访问
登录测试账户:
- 普通用户:user / 123456
- 管理员:admin / admin123
你可以观察不同用户对不同路径的访问结果。
✅ 成果达成:你已经搭建了一个带有登录和权限控制的完整安全系统!
常见问题解答
作为刚入门的新手,你可能会遇到以下一些常见问题,下面我们一一解答:
Q1:为什么我在访问任何页面都跳转到登录页?
A:因为你开启了Spring Security,它默认会对所有请求进行安全控制。除非你显式允许某些路径(如静态资源),否则都需要登录访问。
Q2:为什么我不能登录?输入正确的账号密码也不行?
A:请检查你是否清除了缓存浏览器中的旧Cookie,或者有没有拼写错误。另外,密码是否匹配也需确认。
Q3:如何退出当前登录状态?
A:Spring Security自动提供了一个 /logout 路径,访问该路径即可退出登录。
Q4:我可以把用户信息存在数据库中吗?
A:当然可以!我们这里是用内存模拟用户数据,下一阶段就可以连接MySQL或PostgreSQL等数据库进行持久化存储。
学习建议:下一步怎么学?
恭喜你完成了第一个基于Spring Security的安全系统!接下来你可以朝着以下几个方向继续学习:
1. 进阶主题:
- 数据库用户认证(JDBC、MyBatis、JPA)
- JWT令牌认证(常用于前后端分离项目)
- OAuth2第三方登录(如微信、QQ登录)
- RBAC权限模型设计与实现
2. 推荐学习顺序:
- 先掌握Spring Boot基础知识
- 掌握Thymeleaf模板引擎(如果想定制登录页面)
- 学习RESTful API设计,结合Spring Security实现无状态认证
- 尝试Spring Security + Vue.js前后端分离项目实战
3. 推荐资料:
- 官方文档:https://spring.io/projects/spring-security
- 书籍:《Spring Security实战》《Spring微服务实战》
- B站视频:搜索关键词“Spring Security入门”即可找到大量教学视频
总结
本教程从零开始,一步步教你搭建一个基于Spring Security的基础安全系统:
- 介绍了Spring Security的作用和应用场景
- 搭建了基本的开发环境
- 解释了认证、授权、角色等关键概念
- 通过实战代码实现了页面访问控制和权限分级
- 回答了一些初学者常见问题
- 提供了进一步学习的方向
只要你坚持动手实践,相信很快就能掌握这一关键技术,并在真实项目中灵活运用!
加油!祝你早日成为安全领域的“守门人”!🔒

评论 0