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

在开发Web应用的时候,安全性是非常重要的一环。你肯定不希望随便一个人都能访问你的后台数据,对吧?这时候,就需要一个工具来帮助我们控制“谁可以访问什么”。
Spring Security就是这样一个工具 —— 它是为Java开发者设计的权限管理框架,能够帮助我们在Spring项目中非常方便地实现用户登录、权限控制、加密存储等安全功能。
简单来说,它的作用包括:
- 用户必须登录才能访问某些页面
- 不同的用户有不同的权限,比如普通用户和管理员能看到的内容不同
- 密码不能以明文形式存入数据库,需要加密处理
- 可以防御一些常见的攻击,比如CSRF攻击
这篇文章的目标是:带领你用最简单的方式,在一个空白项目里加入Spring Security的基本安全认证功能。
环境准备:你需要哪些工具和环境?

要开始我们的第一个Spring Security项目,我们需要准备好以下开发环境。
1. Java开发环境
推荐使用 JDK 17,它是一个稳定版本,兼容性好。你可以从 Oracle官网 或 Adoptium 下载并安装。
安装完成后,在命令行运行:
java -version
如果看到类似下面的信息说明安装成功:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)
2. 构建工具:Maven
Spring Boot项目通常使用Maven作为依赖管理工具。如果你还没有安装Maven,可以从官网下载安装。
安装后检查:
mvn -v
3. IDE推荐:IntelliJ IDEA 社区版
新手强烈建议使用 IntelliJ IDEA(社区版免费),它对Spring Boot有很好的支持。当然也可以使用VSCode + Java扩展,不过IDEA会更方便些。
4. 创建项目:通过Spring Initializr
我们可以借助官方的在线生成器快速创建项目骨架:
设置如下选项:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新版(例如3.2.x)
- Group: com.example
- Artifact: security-demo
- Name: SecurityDemoApplication
- Dependencies:
- Spring Web
- Spring Security
点击 Generate 下载项目压缩包,并解压到本地。
核心概念:Spring Security中最常见的几个术语解释

为了让我们更好地理解接下来的代码,先来看看几个核心的概念,用小白语言解释。
1. Authentication(身份验证)
说白了就是:“你是谁?” —— 你能通过用户名和密码证明自己的身份吗?
Spring Security通过一系列过滤器链来验证用户身份,比如检查是否提供了用户名和密码。
2. Authorization(授权)
意思是:“你能干什么?” —— 即使你是登录用户,也不一定能做所有事。比如普通用户无法访问后台管理页面。
3. SecurityFilterChain(安全过滤链)
这是一个流程图一样的结构,用来定义请求经过哪些安全检查,如是否登录、是否有权限访问某页面等等。
4. UserDetailsService(用户详情服务)
这个接口负责根据用户名查询用户信息,比如密码、权限等。
5. PasswordEncoder(密码编码器)
用于加密和验证密码,比如将用户输入的明文密码进行加密保存到数据库,避免密码泄露。
实战项目:一步步实现基本的登录认证

现在我们来实践一下,如何在一个Spring Boot项目中使用Spring Security实现用户登录和权限控制。
步骤1:导入依赖
打开 pom.xml 文件,确认是否已经引入如下两个关键依赖(Spring Security 和 Spring Web):
<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>
如果有,说明我们准备好了!

步骤2:创建控制器
在 src/main/java/com/example/securitydemo/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 adminPage() {
return "这是管理员页面,只有管理员才能看到哦~";
}
}
目前还无法访问这两个页面,因为Spring Security默认开启了安全机制。
步骤3:开启Spring Security配置
我们需要手动添加一个配置类来告诉Spring Security怎么处理登录和权限。
创建 SecurityConfig.java,放在主包目录中(比如 com.example.securitydemo.config 包):
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 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 filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").authenticated() // 需要登录才能访问
.requestMatchers("/admin").hasRole("ADMIN") // 必须是管理员角色才能访问
.anyRequest().permitAll()
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页路径
.permitAll()
)
.logout(logout -> logout
.permitAll()
);

return http.build();
}
}
这段配置的意思总结如下:
- 定义了两个用户:user(普通用户)、admin(管理员)
/hello接口要求用户必须登录/admin接口只允许具有 ADMIN 角色的用户访问- 登录页面路径是
/login(虽然我们还没写页面) - 支持退出登录
步骤4:启动项目并测试
执行项目的主类 SecurityDemoApplication.java 启动项目。
测试1:访问 /hello
浏览器访问:http://localhost:8080/hello
你会被重定向到默认登录页面(由Spring Security自动生成),输入用户名和密码:
- 用户名:user
- 密码:123456
提交后就可以看到页面内容了 ✅
测试2:访问 /admin
再次访问 http://localhost:8080/admin,你会发现即使你已登录,也无法进入该页面 —— 因为你只是普通用户。
换回用户名:admin / 密码:admin123 登录后,就可以正常访问 ❗️
小结一下现在的效果
- 任何访客都必须登录才能访问
/hello - 仅限
ADMIN角色才能访问/admin - 普通用户看不到管理员页面
常见问题:新手常遇到的问题及解决方案
问题1:启动报错,提示“No static resource login”
你可能会看到日志中出现找不到 /login 页面的警告。
别担心!这是因为我们没有自己编写登录页面,默认情况下Spring Security会提供一个简单的登录表单。你直接访问受保护页面就会自动跳转到那个登录界面。
解决方法: 可以选择继续使用默认的登录界面,或者后面学习“自定义登录页面”部分去替换为自己写的前端。
问题2:忘记密码怎么办?
在这个例子中,用户数据保存在内存里,所以重启程序后还是原来的密码。但在实际项目中,这些用户数据应该来自数据库。
问题3:密码明文存储危险怎么办?
是的,我们示例中使用的 withDefaultPasswordEncoder() 是用于演示目的的,真实项目必须改用更强的加密方式,比如 BCryptPasswordEncoder。
我们会在这个教程的后续章节介绍。
学习建议:下一步你可以学什么?
掌握了Spring Security的基础之后,你就可以尝试学习更多进阶内容了:
✅ 进阶方向一:连接数据库(持久化用户)
- 使用JPA或MyBatis与数据库连接
- 使用
UserDetailsService接口读取真实数据库中的用户信息
✅ 进阶方向二:自定义登录页面
- 自己写HTML登录页面
- 加入CSS美化
- 处理验证码、记住我等功能
✅ 进阶方向三:整合JWT,打造前后端分离的安全体系
- 适用于Vue、React等前端项目
- 使用令牌代替Session
✅ 进阶方向四:RBAC权限模型学习
- 学习基于角色和权限的复杂权限管理系统
结语:坚持就是胜利!
恭喜你完成了Spring Security的第一步学习!你现在拥有了一个带有登录验证和权限区分的完整小系统!
刚开始可能觉得有点抽象,但只要你动手跟着写了代码,就能慢慢理解其中的逻辑。
温馨提示:不要只看不动手!一定要亲自敲一遍代码,出错了也别怕,查错误的过程也是成长的一部分!
下一阶段我们将会一起学习“Spring Security结合数据库”的内容,记得持续关注哦!💪
如果你想获得完整的源码或其他Spring系列教程资源,可以在下方留言告诉我,我会继续更新相关内容!

评论 0