Spring Security 初识:从零创建第一个受保护的应用
1. 引言在 Web 应用开发中安全永远是绕不开的话题。无论是用户登录、权限控制还是接口防刷安全框架都扮演着至关重要的角色。而在 Java 生态中Spring Security无疑是最主流、最强大的安全解决方案。很多初学者第一次接触 Spring Security 时往往会被它庞大的过滤器链、复杂的配置类和各种安全概念劝退。但事实上Spring Security 的设计哲学是约定大于配置——你甚至不需要写一行安全相关的代码它就能为你的应用提供基础的保护。本文将通过一个最简单的实战项目带你迈出 Spring Security 的第一步创建一个包含安全依赖的 Spring Boot 应用启动它观察默认的登录页和自动生成的密码并理解背后默认安全过滤器链的工作原理。2. 环境准备在开始之前请确保你的本地环境满足以下条件JDK8 或以上版本推荐 11 或 17构建工具Maven 3.6 或 Gradle本文以 Maven 为例IDEIntelliJ IDEA、Eclipse 或 VS Code 均可网络能够访问 Spring Initializr 或 Maven 中央仓库本文使用的 Spring Boot 版本为2.7.x稳定版。如果你使用 Spring Boot 3.x核心概念完全一致仅部分配置项名称略有差异。3. 创建项目3.1 使用 Spring Initializr 创建项目打开 Spring Initializr按照以下步骤配置项目Project选择MavenLanguage选择JavaSpring Boot选择2.7.18或你本地的稳定版本Group填写com.exampleArtifact填写security-demoDependencies搜索并添加以下依赖Spring Web用于构建 Web 应用Spring Security核心安全依赖点击Generate按钮下载项目压缩包解压后用 IDE 打开。3.2 项目结构一览生成的项目结构如下security-demo/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/securitydemo/ │ │ └── SecurityDemoApplication.java │ └── resources/ │ └── application.properties ├── pom.xml └── ...其中pom.xml中已经自动引入了我们需要的两个核心依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependency4. 编写第一个受保护的接口为了让应用有东西可以被保护我们先创建一个简单的 REST 接口。在com.example.securitydemo包下新建一个控制器类HelloController.javapackagecom.example.securitydemo;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassHelloController{GetMapping(/hello)publicStringhello(){returnHello, Spring Security!;}}这个接口非常简单访问/hello会返回一段欢迎文字。但当我们引入 Spring Security 依赖后这个接口将不再是裸奔状态——所有请求都会被默认的安全机制拦截。5. 启动应用观察默认安全行为5.1 启动应用直接运行SecurityDemoApplication的主方法或者使用 Maven 命令启动mvn spring-boot:run观察控制台输出你会看到类似如下的日志Using generated security password: 8a3f9c2e-1b4d-4e7f-9a2c-5d6e7f8a9b0c Using generated security password: 8a3f9c2e-1b4d-4e7f-9a2c-5d6e7f8a9b0c这一行就是 Spring Security 自动生成的默认密码用户名固定为user。请务必复制保存这串密码稍后登录时会用到。5.2 访问受保护接口打开浏览器访问http://localhost:8080/hello。你会发现页面并没有直接显示Hello, Spring Security!而是被重定向到了一个登录页面http://localhost:8080/login这就是 Spring Security 的默认登录页。它由框架自动生成包含用户名和密码两个输入框。5.3 使用默认账号登录在登录页中输入用户名user密码控制台输出的那串随机密码点击Sign in页面会跳转回/hello并成功显示Hello, Spring Security!至此你已经成功创建了第一个受 Spring Security 保护的应用6. 核心理解约定大于配置整个过程我们没有编写任何安全配置代码但应用却自动获得了登录认证能力。这正是 Spring Security 的约定大于配置理念的体现。当我们引入spring-boot-starter-security依赖后Spring Boot 的自动配置机制会为我们做以下几件事自动生成一个默认用户用户名为user密码为启动时随机生成的一串 UUID。自动启用表单登录所有请求默认都需要认证后才能访问。自动生成登录页和登出功能/login和/logout端点由框架内置。自动配置安全响应头如X-Content-Type-Options、Cache-Control等防止常见 Web 攻击。这些默认行为都定义在SpringBootWebSecurityConfiguration中。如果你不提供任何自定义的SecurityFilterChainBean框架就会使用这套默认配置。7. 核心理解默认的安全过滤器链Spring Security 的核心机制是过滤器链Security Filter Chain。当请求进入应用时会依次经过一系列过滤器每个过滤器负责一项安全检查。默认的过滤器链大致如下否是HTTP 请求SecurityContextPersistenceFilterCsrfFilterUsernamePasswordAuthenticationFilter是否已认证?重定向到 /loginAuthorizationFilter放行到 Controller各过滤器的主要职责如下过滤器职责SecurityContextPersistenceFilter在请求开始时从 Session 加载安全上下文结束时保存回 SessionCsrfFilter处理 CSRF 防护默认拦截非 GET 请求UsernamePasswordAuthenticationFilter处理表单登录请求校验用户名和密码AuthorizationFilter基于当前认证信息做最终的授权判断当未登录用户访问/hello时AuthorizationFilter发现当前没有认证信息于是抛出AccessDeniedException随后框架将请求重定向到/login登录页。登录成功后框架会生成一个Authentication对象存入 Session后续请求便不再被拦截。8. 验证默认配置查看自动生成的登录页Spring Security 的默认登录页虽然功能完整但样式非常朴素。它由DefaultLoginPageGeneratingFilter动态生成 HTML 页面。如果你想确认登录页确实是框架自动生成的可以查看页面源码。你会发现表单的提交地址是/login用户名输入框的name属性为username密码输入框的name属性为password。这些约定都是框架内置的后续自定义登录页时也需要遵循同样的命名规范。9. 小结与下一步通过本文的实践你已经完成了 Spring Security 的入门第一步使用 Spring Initializr 创建了包含安全依赖的项目启动应用并观察到了自动生成的登录页和默认密码使用user和随机密码成功登录理解了约定大于配置的设计理念初步认识了默认安全过滤器链的工作流程Spring Security 的世界远不止于此。下一步你可以尝试在application.properties中配置固定的用户名和密码自定义登录页和登录成功后的跳转逻辑基于内存或数据库实现用户管理使用 JWT 实现无状态认证希望这篇文章能帮你迈出 Spring Security 学习的第一步。如果你在实践过程中遇到任何问题欢迎在评论区留言交流

相关新闻

脉冲试验机:从压力波形到可靠性验证的关键设备

脉冲试验机:从压力波形到可靠性验证的关键设备

前段时间去一家液压管路企业做技术交流,对方的负责人把一截断裂的软管摆在桌上,说这批产品装到设备上不到两个月就漏了,整条产线停了一周。我拿起来看了一眼断裂位置,心里基本有数——这是典型的脉冲疲劳失效,不是材料…

2026/9/5 20:05:13 阅读更多 →
一只 399 美元的机器鸭,预售 6 小时破 100 万美元:订单排到 2027

一只 399 美元的机器鸭,预售 6 小时破 100 万美元:订单排到 2027

一只 399 美元的机器鸭,预售 6 小时破 100 万美元:订单排到 2027 一只 25 厘米高、不到 800 克重的机器鸭子,8 月 27 日开卖当天,6 小时销售额就突破了 100 万美元。开卖 24 小时卖出超过 5000 台,5 天卖掉超过 1 万台…

2026/9/5 20:05:36 阅读更多 →
VoxCPM开源语音模型实战:日语与粤语旁白生成全流程指南

VoxCPM开源语音模型实战:日语与粤语旁白生成全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/5 20:05:08 阅读更多 →

最新新闻

Windows Terminal 连接 Azure Cloud Shell 的完整设计与源码实现

Windows Terminal 连接 Azure Cloud Shell 的完整设计与源码实现

Windows Terminal 连接 Azure Cloud Shell 的完整设计与源码实现 【免费下载链接】terminal The new Windows Terminal and the original Windows console host, all in the same place! 项目地址: https://gitcode.com/GitHub_Trending/term/terminal Windows Terminal…

2026/9/5 20:05:49 阅读更多 →
越痛苦的学习越高效?科学区分有效困难与无效消耗

越痛苦的学习越高效?科学区分有效困难与无效消耗

有一段时间我在学一个不算熟的技术框架。白天看文档,晚上把重点摘到笔记软件里,段落分类、颜色标注都做得整整齐齐。整个学习过程非常舒服,几乎没有卡壳,甚至有一种“今天摄入量很大”的满足感。结果一周之后,接到一个…

2026/9/5 20:05:49 阅读更多 →
Lucide React 图标导出实操手册:3 步跑通完整导出流程,附 5 个避坑自查项

Lucide React 图标导出实操手册:3 步跑通完整导出流程,附 5 个避坑自查项

Lucide React 图标导出实操手册:3 步跑通完整导出流程,附 5 个避坑自查项 【免费下载链接】lucide Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons. 项目地址: https://gitcode.co…

2026/9/5 20:05:49 阅读更多 →
逆矩阵计算总出错?从矩阵运算定义到方法选择全解析

逆矩阵计算总出错?从矩阵运算定义到方法选择全解析

晚上十点,你打开 Day36 的线代每日一题。题目要求做逆矩阵计算,旁边还标着矩阵运算定义、矩阵运算。一看“逆矩阵”三个字,很多人会立刻把伴随矩阵、初等行变换、公式法在脑子里过一遍,然后开始套流程。但真正落笔时,往…

2026/9/5 20:05:49 阅读更多 →
从直拍素材到内容资产管理:命名规范与归档流程指南

从直拍素材到内容资产管理:命名规范与归档流程指南

“260809 | 静子Shizuko 直拍 | BlankPoker | 「BLANK ARCANA」BP 3rd Anniversary Live。”这行字放进视频平台,是一条投稿标题;放进本地文件夹,是一串文件名;放进长期做内容运营的人眼里,却是一份媒体资产索引。日期…

2026/9/5 20:05:49 阅读更多 →
Julia模块、作用域与环境:理解声明与生效位置的区别

Julia模块、作用域与环境:理解声明与生效位置的区别

先说结论:标题里的“宫主星”和“星星落宫”并不是 Julia 的官方术语。如果你是在查 Julia 编程语言相关话题,真正想问的问题大概率是:在一个模块、一个脚本或者一套依赖环境里,“由谁负责”和“实际落在哪里”是两回事。对应到 J…

2026/9/5 20:04:49 阅读更多 →

日新闻

基于STA-ResNet的深度学习信道估计:时空注意力与残差网络实战解析

基于STA-ResNet的深度学习信道估计:时空注意力与残差网络实战解析

简介:本资源是一个面向通信工程、信号处理及AI交叉领域研究者的深度学习实践项目,聚焦无线通信系统中信道估计精度提升这一核心难题。项目实现并开源了STA-ResNet模型——一种融合空间注意力、时间注意力与ResNet残差结构的端到端信道估计网络&#xff0…

2026/9/5 0:00:19 阅读更多 →
知识库如何察觉自己“不再为真”?TMS真值维护系统原理与实践

知识库如何察觉自己“不再为真”?TMS真值维护系统原理与实践

如果一个知识库昨天还在告诉你“某个接口会返回某个字段”,今天上游系统悄悄把这个字段下掉了,知识库会怎样?对大部分系统来说,它不会有任何反应。它依然保存着那条知识,依然能被检索到,依然会被下游服务消…

2026/9/5 0:00:19 阅读更多 →
ToolJet深度解析:开源低代码平台核心能力与实战指南

ToolJet深度解析:开源低代码平台核心能力与实战指南

深入解析 ToolJet:开源低代码平台的核心能力与实战上手指南 1. ToolJet 是什么?为什么低代码平台需要重新被审视 2. ToolJet 的核心功能拆解 2.1 可视化应用构建器 2.2 数据源连接与查询管理 2.3 前端组件与事件交互 2.4 权限管理与协作能力 3. 环…

2026/9/5 0:00:19 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/4 10:54:27 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/4 14:20:02 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/4 20:51:50 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/5 5:05:50 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/5 19:29:20 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/4 9:37:01 阅读更多 →