当前位置: 首页 > ops >正文

Spring Security入门:创建第一个安全REST端点项目

项目初始化与基础配置

创建基础Spring Boot项目

我们首先创建一个名为ssia-ch2-ex1的空项目(该名称与配套源码中的示例项目保持一致)。项目需要添加以下两个核心依赖:

org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-security

默认安全配置解析

启动应用时,Spring Boot会自动应用默认安全配置:

  1. 控制台会输出随机生成的UUID密码(格式:Using generated security password: 93a01cf0-794b-4b98-86ef-54860f36f7f3
  2. 默认启用HTTP Basic认证机制
  3. 内置用户名为"user"
  4. 自动保护所有端点

创建测试端点

在controllers包下创建HelloController类:

@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "Hello!";}
}

注意:控制器必须位于主启动类所在包或其子包下,否则需要显式配置@ComponentScan

验证安全行为

未授权访问测试

使用cURL发起请求:

curl http://localhost:8080/hello

将返回401 Unauthorized响应:

{"status":401,"error":"Unauthorized","message":"Unauthorized","path":"/hello"
}
授权访问测试

使用默认凭证访问:

curl -u user:93a01cf0-794b-4b98-86ef-54860f36f7f3 http://localhost:8080/hello

成功返回:

Hello!

HTTP Basic认证原理

cURL的-u参数实际会生成Base64编码的Authorization头,等价于:

curl -H "Authorization: Basic dXNlcjo5M2EwMWNmMC03OTRiLTRiOTgtODZlZi01NDg2MGYzNmY3ZjM=" localhost:8080/hello

可通过以下命令生成Base64凭证:

echo -n user:93a01cf0-794b-4b98-86ef-54860f36f7f3 | base64

安全架构关键组件

默认配置包含以下核心组件:

  1. UserDetailsService:内存存储用户凭证
  2. PasswordEncoder:密码编解码器
  3. AuthenticationProvider:认证逻辑处理器
  4. SecurityContext:存储认证后的安全上下文

注意:HTTP Basic认证本身不提供凭证加密,仅进行Base64编码。生产环境必须配合HTTPS使用。

HTTP Basic认证深度解析

cURL工具认证原理剖析

使用cURL的-u参数实现HTTP Basic认证时,工具会自动完成以下处理流程:

  1. username:password格式的凭证字符串进行Base64编码
  2. 生成标准的Authorization请求头:Basic
  3. 附加到HTTP请求头部发送

技术实现等价于:

# 原始凭证
username="user"
password="93a01cf0-794b-4b98-86ef-54860f36f7f3"# Base64编码处理
encoded=$(echo -n "$username:$password" | base64)# 最终请求头
Authorization: Basic $encoded

手动构建Authorization头

通过命令行工具可完整演示认证头的生成过程:

# 在Linux/Git Bash环境下执行(-n参数避免添加换行符)
echo -n "user:93a01cf0-794b-4b98-86ef-54860f36f7f3" | base64# 输出结果示例
dXNlcjo5M2EwMWNmMC03OTRiLTRiOTgtODZlZi01NDg2MGYzNmY3ZjM=

生成的Base64字符串可直接用于构造请求:

http://www.xdnf.cn/news/10496.html

相关文章:

  • [RoarCTF 2019]Easy Calc
  • SQL 逻辑处理顺序详解
  • 第二章支线五 ·CSS炼金续章:变量与暗黑主题术
  • 放弃 tsc+nodemon 使用 tsx 构建Node 环境下 TypeScript + ESM 开发环境搭建指南
  • SpringMVC的注解
  • StarRocks物化视图
  • 可视化大屏通用模板Axure原型设计案例
  • 代码随想录60期day54
  • [leetcode] 二分算法
  • 密码学:解析Feistel网络结构及实现代码
  • 传送文件利器wormhole的使用方法
  • 【iOS】ARC 与 Autorelease
  • 数据库系统概论(十五)详细讲解数据库视图
  • Linux运维笔记:服务器安全加固
  • HTML 中 class 属性介绍、用法
  • AlmaLinux OS 10 正式发布:兼容 RHEL 10 带来多项技术革新
  • Kotlin 中的 companion object 使用指南
  • (LeetCode 每日一题)135. 分发糖果 ( 贪心 )
  • 电子电气架构 --- 如何应对未来区域式电子电气(E/E)架构的挑战?
  • 【安全】VulnHub靶场 - W1R3S
  • STM32:CAN总线精髓:特性、电路、帧格式与波形分析详解
  • 单元测试-断言常见注解
  • 探索大语言模型(LLM):参数量背后的“黄金公式”与Scaling Law的启示
  • 使用 OpenCV (C++) 进行人脸边缘提取
  • ASC格式惯导数据文件转IMR格式文件
  • window 显示驱动开发-驱动程序处理的Multiple-Processor优化
  • 使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程
  • 云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
  • SpringBoot-配置Spring MVC
  • 学习经验分享【40】目标检测热力图制作