Spring Security基础:快速搭建安全认证系统
——给零基础同学的实战入门指南
大家好,我是公司后端团队的培训负责人,带过几十位应届生从“Hello World”走到独立开发。今天写这篇教程,是因为我发现很多刚接触Java后端的同学,一看到“Spring Security”就头大——配置复杂、概念抽象、文档晦涩。我当初学的时候也踩过无数坑,所以特别想用最直白的方式,带你用不到3000字,亲手跑通一个带登录认证的Web应用。
💡 为什么学它?
无论你是做内部管理系统、电商后台,还是API服务,用户认证与权限控制都是产品的核心安全模块。Spring Security 是 Java 生态中最主流的安全框架,掌握它,是成为合格后端工程师的关键一步。
一、环境准备:5分钟搭好开发环境
我们用 Spring Boot + Spring Security 快速启动项目。你不需要懂Maven细节,按步骤来就行。
所需工具清单
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 推荐使用 LTS 版本 |
| IDE | IntelliJ IDEA (社区版免费) | 也可用 VS Code + Java 插件 |
| 构建工具 | Maven 或 Gradle | 教程以 Maven 为例 |
步骤1:创建Spring Boot项目
访问 https://start.spring.io,填写如下信息:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x(最新稳定版)
- Group:
com.example - Artifact:
security-demo - Dependencies: 勾选 Spring Web 和 Spring Security
点击 “Generate” 下载 ZIP 包,解压后用 IDEA 打开。
步骤2:验证基础运行
打开 src/main/java/com/example/securitydemo/SecurityDemoApplication.java,直接运行 main 方法。
启动成功后,控制台会打印类似:
Tomcat started on port(s): 8080 (http)
此时访问 http://localhost:8080,你会发现页面跳转到一个自动生成的登录页!用户名是 user,密码在启动日志中(搜索 Using generated security password)。
✅ 恭喜!你已经拥有了一个带安全认证的Web应用——虽然还没写一行代码。
二、核心概念:3个关键词讲清Spring Security
别被术语吓到,其实就三件事:
1. 认证(Authentication)
“你是谁?”
比如:用户输入用户名和密码,系统验证是否合法。
2. 授权(Authorization)
“你能干什么?”
比如:普通用户只能看自己的订单,管理员能删数据。
3. 过滤器链(Filter Chain)
安全检查像安检门,请求进来先过一系列关卡。
Spring Security 在请求到达你的Controller前,自动插入多个过滤器(如登录检查、CSRF防护等)。
🧠 类比理解:
把你的Web应用想象成一栋写字楼。
- 认证 = 门禁刷卡(确认你是员工)
- 授权 = 电梯权限(你只能去5楼,不能去机房)
- 过滤器链 = 从大门→安检→电梯的整套流程
三、实战项目:手把手搭建自定义登录系统
现在我们要替换掉默认登录页,实现自己的用户名/密码登录,并保护 /admin 路径。
第1步:创建一个简单的Controller
// src/main/java/com/example/securitydemo/controller/HomeController.java
package com.example.securitydemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/hello")
public String hello() {
return "Hello, anonymous user!";
}
@GetMapping("/admin")
public String admin() {
return "Welcome, admin!";
}
}
第2步:配置Security规则
新建配置类:
// src/main/java/com/example/securitydemo/config/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.config.annotation.web.configuration.EnableWebSecurity;
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
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").permitAll() // 允许所有人访问
.requestMatchers("/admin").hasRole("ADMIN") // 只有ADMIN角色能访问
.anyRequest().authenticated() // 其他请求需登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页路径
.permitAll() // 登录页无需认证
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public InMemoryUserDetailsMgr userDetailsService() {
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("123456")
.roles("ADMIN")
.build();
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, user);
}
}
🔍 关键点解释:
InMemoryUserDetailsManager:把用户存在内存里(仅用于演示!生产要用数据库).roles("ADMIN"):Spring Security 会自动加上ROLE_前缀,所以实际权限是ROLE_ADMINformLogin().loginPage("/login"):告诉框架“我要用自己的登录页”
第3步:创建自定义登录页(可选但推荐)
虽然我们返回JSON,但为了体验完整流程,加个简单HTML:
<!-- src/main/resources/static/login.html -->
<!DOCTYPE html>
<html>
<head><title>Login</title></head>
<body>
<form action="/login" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
</body>
</html>
⚠️ 注意:表单字段名必须是
username和password,这是Spring Security默认接收的参数名。
第4步:测试效果
- 启动应用
- 访问
http://localhost:8080/hello→ 直接显示内容(无需登录) - 访问
http://localhost:8080/admin→ 跳转到/login - 用
admin / 123456登录 → 成功看到 “Welcome, admin!” - 用
user / 123456登录 → 访问/admin会被拒绝(403错误)
四、新手常见问题 & 避坑指南
❓ 问题1:为什么登录后总是跳回首页?
原因:Spring Security 默认登录成功后跳转到之前被拦截的页面,如果没有则跳 /。
解决:在 formLogin() 中加 .defaultSuccessUrl("/admin", true) 强制跳转。
❓ 问题2:密码明文存储太危险!
正确做法:永远不要用 withDefaultPasswordEncoder()(它只是教学用)!
生产方案:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
然后存密码时用 passwordEncoder.encode("123456")。
❓ 问题3:我的API是前后端分离的,怎么用?
去掉 formLogin(),改用 JWT 或 Session API。但那是进阶内容,建议先掌握基础再拓展。
❓ 问题4:为什么提到Python?
🤔 你可能疑惑:标题有“Python”,但全文是Java?
解释:在真实产品开发中,安全模块常需跨语言协作。比如:
- 用 Python 写爬虫测试登录接口
- 用 Python 脚本批量生成测试用户数据
- 数据分析团队用 Python 读取用户行为日志
所以,即使主语言是Java,了解如何与Python生态协同,是综合能力的体现。
五、学习建议:下一步怎么走?
巩固基础
- 尝试把用户数据从内存迁移到 H2 数据库(Spring Boot内置)
- 实现“记住我”功能(
.rememberMe())
深入授权
- 学习
@PreAuthorize("hasRole('ADMIN')")注解式权限 - 实现动态权限(从数据库读取用户角色)
- 学习
扩展场景
- 集成 OAuth2(微信/Google登录)
- 保护 REST API(返回 JSON 而非跳转页面)
避坑提醒
不要一上来就学JWT!很多教程让新手直接上JWT,结果连 Session 原理都不懂。先掌握传统认证,再学无状态方案。
结语
今天你已经完成了:
✅ 理解认证/授权核心概念
✅ 搭建带自定义登录的安全应用
✅ 解决了4个高频新手问题
记住:安全不是功能,而是产品底线。哪怕你的系统只有10个用户,也要从第一天就考虑安全设计。
我带过的应届生里,凡是能把Spring Security基础打牢的,后续学Shiro、OAuth2、微服务鉴权都特别快。底层逻辑相通,区别只在实现细节。
动手试试吧!遇到问题欢迎留言讨论。下期我们聊聊《如何用Spring Security实现RBAC权限模型》。
作者:某大厂后端培训负责人 | 专注新人成长 | 本文代码已通过 Spring Boot 3.2.5 验证

评论 0