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

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.lryc.cn/news/2401802.html

相关文章:

  • [Java 基础]数组
  • fastadmin fildList 动态下拉框默认选中
  • java学习笔记——数组和二维数组
  • ‘pnpm‘ 不是内部或外部命令,也不是可运行的程序
  • Android Test2 获取系统android id
  • webpack打包学习
  • 基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统
  • 服务器CPU被WMI Provider Host系统进程占用过高,导致系统偶尔卡顿的排查处理方案
  • JavaSwing之--JMenuBar
  • vue3+elementplus表格表头加图标及文字提示
  • 【物联网-S7Comm协议】
  • NLP中的input_ids是什么?
  • LeetCode Hot100刷题——划分字母区间
  • c++ 基于OpenSSL的EVP接口进行SHA3-512和SM3哈希计算
  • Vue3实现拖拽改变元素大小
  • Spring IoC 详解:原理、实现与实战
  • 深入Java NIO:构建高性能网络应用
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)
  • SSH/RDP无法远程连接?腾讯云CVM及通用服务器连接失败原因与超全排查指南
  • 网络测试实战:金融数据传输的生死时速
  • 数据库系统概论(十四)详细讲解SQL中空值的处理
  • 【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
  • [蓝桥杯]三体攻击
  • 深入解析支撑向量机(SVM):原理、推导与实现
  • 一台电脑联网如何共享另一台电脑?网线方式
  • 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?
  • MacroDroid安卓版:自动化操作,让生活更智能
  • 力提示(force prompting)的新方法
  • 【Redis实战:缓存与消息队列的应用】