Spring Security入门:创建第一个安全REST端点项目
项目初始化与基础配置
创建基础Spring Boot项目
我们首先创建一个名为ssia-ch2-ex1的空项目(该名称与配套源码中的示例项目保持一致)。项目需要添加以下两个核心依赖:
org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-security
默认安全配置解析
启动应用时,Spring Boot会自动应用默认安全配置:
- 控制台会输出随机生成的UUID密码(格式:
Using generated security password: 93a01cf0-794b-4b98-86ef-54860f36f7f3
) - 默认启用HTTP Basic认证机制
- 内置用户名为"user"
- 自动保护所有端点
创建测试端点
在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
安全架构关键组件
默认配置包含以下核心组件:
- UserDetailsService:内存存储用户凭证
- PasswordEncoder:密码编解码器
- AuthenticationProvider:认证逻辑处理器
- SecurityContext:存储认证后的安全上下文
注意:HTTP Basic认证本身不提供凭证加密,仅进行Base64编码。生产环境必须配合HTTPS使用。
HTTP Basic认证深度解析
cURL工具认证原理剖析
使用cURL的-u
参数实现HTTP Basic认证时,工具会自动完成以下处理流程:
- 将
username:password
格式的凭证字符串进行Base64编码 - 生成标准的Authorization请求头:
Basic
- 附加到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字符串可直接用于构造请求: