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

在开发 Web 应用时,我们常常需要保护某些页面或接口,比如用户中心、后台管理等,只允许特定的用户访问。这时候我们就需要用到一个功能强大的安全框架——Spring Security。
简单来说:
Spring Security 是一个基于 Java 的安全框架,主要用于控制用户访问权限、处理登录验证、实现角色控制等功能。
你可能听说过“登录注册”、“权限控制”这些概念,Spring Security 就是用来实现这些功能的工具包。
本教程将从零开始,带着你一步步使用 Spring Security 搭建一个最简单的安全认证系统,让你理解基本的流程和原理。
环境准备:开发环境搭建

1. 软件要求
请确保你已经安装以下软件:
- Java 8 或以上版本(推荐 JDK 17)
- Maven 构建工具(自动依赖管理)
- IDE:IntelliJ IDEA / Eclipse / VS Code(推荐 IntelliJ IDEA)
- 浏览器(Chrome/Firefox)
可以通过终端输入以下命令检查版本:
java -version
mvn -v
2. 创建 Spring Boot 项目
打开 https://start.spring.io,进行如下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 3.x(建议使用最新稳定版)
- Group: com.example
- Artifact: spring-security-demo
- Dependencies:
- Spring Web
- Spring Security
点击 Generate 下载压缩包,解压后导入你的 IDE 中运行。
3. 启动项目
进入主类 SpringSecurityDemoApplication.java,运行它。默认端口是 8080,浏览器访问:
http://localhost:8080
不出意外你会看到一个 404 错误,说明服务启动成功了,但我们还没有写页面。
核心概念:通俗易懂地讲清楚几个关键点


在实际开发前,先了解几个非常重要的 Spring Security 概念,它们是构建安全系统的基石。
1. 认证(Authentication)
就是判断你是谁的过程。比如输入用户名和密码登录系统,这个过程就叫做认证。
你可以把认证想成进电影院之前要刷身份证——看你是不是买票的人。
2. 授权(Authorization)
认证通过之后,还要看你有没有权限做某件事。比如普通用户不能删除文章,管理员才可以。
授权就是判断你能干什么事。
3. 用户(User)与角色(Role)
用户是你网站上的访客或者注册用户。
角色是对用户分组的一种方式。常见角色有:ROLE_USER、ROLE_ADMIN。
例如:
- Alice 是用户,属于
ROLE_USER - Bob 是用户,属于
ROLE_ADMIN
4. 安全过滤器链(Filter Chain)
Spring Security 使用一系列过滤器来拦截请求,根据规则决定是否放行请求。
可以理解为层层关卡,每一道门都会检查一次权限。
实战项目:一步步构建第一个安全系统


我们将完成以下几个目标:
- 创建一个主页
/,所有人都能访问 - 创建一个受保护页面
/admin,只有登录后的管理员才能访问 - 使用内存中的两个用户测试登录
第一步:创建控制器 Controller
在 src/main/java/com/example/springsecuritydemo/controller 目录下创建 HomeController.java:
package com.example.springsecuritydemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/")
public String home() {
return "欢迎来到首页!任何人都可以看到这个页面";
}
@GetMapping("/admin")
public String admin() {
return "欢迎来到管理员页面!只有管理员能看到哦~";
}
}
现在再次启动项目,在浏览器访问:
- http://localhost:8080/ ✅ 成功
- http://localhost:8080/admin ✅ 成功(但这是不对的)
因为我们还没有添加任何安全控制。
第二步:配置安全规则
我们需要告诉 Spring Security 哪些页面需要保护。
新建文件:SecurityConfig.java
位置:src/main/java/com/example/springsecuritydemo/config/SecurityConfig.java
package com.example.springsecuritydemo.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.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll()
.requestMatchers("/admin").authenticated()
)
.formLogin(form -> form
.loginPage("/login") // 登录页
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService 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);
}
}
上面代码的作用:
- 配置哪些路径需要认证访问
- 设置登录页面地址
/login - 创建两个内存用户(用于测试)
注意:这里只是演示用途,生产环境中不会明文保存密码。
第三步:添加登录页面
虽然我们没有自己写登录页面,但 Spring Security 会自动提供一个简单的登录界面。
你现在访问:http://localhost:8080/admin
会自动跳转到登录页面,你可以尝试用之前设置的用户名登录:
- username:
user/ password:123456→ 可以登录,但是无法访问/admin - username:
admin/ password:admin123→ 登录后可以访问/admin
因为我们在配置中设置了:
.requestMatchers("/admin").authenticated()
意思是只要登录就能访问。那我们能不能进一步控制只能管理员访问呢?当然可以!
第四步:按角色限制访问权限
修改 SecurityConfig.java 中的 securityFilterChain 方法:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
此时再尝试用普通用户登录并访问 /admin,你会看到错误页面提示“Forbidden”,说明权限校验已生效。
常见问题解答
以下是新手学习过程中容易遇到的问题,以及解决办法。
Q1:为什么我访问 /admin 不弹出登录页,而是直接返回403?
答: 说明你已经登录过,并且当前登录用户没有权限访问该页面。可以尝试清除 Cookie 或更换浏览器隐私窗口重新访问。
Q2:为什么我配置的角色加了 “ROLE_” 前缀?
答: Spring Security 对角色有一个隐式约定,会自动加上 ROLE_ 前缀。你在 .roles("ADMIN") 中只需要写 ADMIN,Spring 会识别为 ROLE_ADMIN。
Q3:怎么查看当前登录用户信息?
你可以修改控制器方法,这样显示当前用户信息:
@GetMapping("/whoami")
public String whoAmI(Principal principal) {
if (principal == null) {
return "未登录";
}
return "当前登录用户:" + principal.getName();
}
Q4:密码明文存储是不是很危险?
答: 是的。目前我们用了 .withDefaultPasswordEncoder() 来方便演示,但在正式开发中应该使用更强的加密算法,如 BCrypt。
学习建议:下一步怎么学?
恭喜你完成了你的第一个 Spring Security 小项目!
接下来你可以沿着这些方向继续深入:
1. 进阶学习内容
| 方向 | 内容 |
|---|---|
| 数据库用户管理 | 把用户信息存入数据库(如 MySQL),而不是内存 |
| 自定义登录页面 | 使用 Thymeleaf 编写自己的登录 HTML 页面 |
| OAuth2 登录 | 支持微信、QQ、GitHub 等第三方登录 |
| JWT Token | 实现无状态的身份验证 |
| 动态权限控制 | 更灵活的权限分配机制 |
2. 工具推荐
- Spring Security 官方文档
- Thymeleaf 教程
- Postman(调试 API 接口好帮手)
3. 实战小项目建议
试着做一个拥有以下功能的小型管理系统:
- 注册登录功能
- 用户主页(只能自己访问)
- 管理员后台(仅 ROLE_ADMIN 可访问)
- 角色管理模块(给用户分配不同角色)
总结
本文是一个完全面向零基础的学习指南,带你认识了 Spring Security 的基本用法,并亲手实践了一个简单的安全认证系统。主要内容包括:
- 认识 Spring Security 是做什么的
- 快速搭建 Spring Boot + Security 项目
- 理解认证、授权、用户、角色等核心概念
- 完成了一个包含登录和权限控制的实战项目
- 解决了新手常见的一些疑问
希望你能够通过这篇教程迈入安全编程的大门,在未来的项目中更安心地实现用户管理和权限控制功能。
如果你觉得这篇文章对你有帮助,别忘了点赞分享哟~ 🎉
✅ 继续加油!安全的世界很广阔,也充满挑战!

评论 0