在Spring Security中,HTTP基本认证(Basic Authentication)和HTTP摘要认证(Digest Authentication)是两种基于HTTP协议的认证机制。以下是它们的详细说明及配置方法:
一、HTTP 基本认证(Basic Authentication)
1. 认证原理
• 流程:
- 客户端请求受保护资源。
- 服务器返回
401 Unauthorized,响应头包含WWW-Authenticate: Basic realm="Realm Name"。 - 客户端将用户名和密码以
Base64编码后填入Authorization: Basic <credentials>头。 - 服务器解码并验证凭据。
• 安全性:
• 明文传输风险:Base64编码易被解码,需配合 HTTPS 使用。
• 适用场景:内部系统或结合 TLS 加密的 API。
2. Spring Security 配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic(); // 启用 HTTP 基本认证
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
// 配置内存用户
UserDetails user = User.builder()
.username("user")
.password("{noop}password") // 明文密码(需指定密码编码器)
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
3. 定制化配置
• 修改 Realm 名称:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.httpBasic()
.realmName("My Secure Realm");
return http.build();
}
二、HTTP 摘要认证(Digest Authentication)
1. 认证原理
• 流程:
- 客户端请求受保护资源。
- 服务器返回
401 Unauthorized,响应头包含WWW-Authenticate: Digest realm="Realm", nonce="随机数", qop="auth"。 - 客户端使用用户名、密码、随机数和其他参数生成
MD5哈希(摘要),发送Authorization: Digest <parameters>头。 - 服务器验证哈希是否匹配。
• 安全性:
• 避免明文传输:密码以哈希形式传输。
• 抗重放攻击:随机数(nonce)有时效性。
• 限制:依赖MD5(已不安全),需配合 HTTPS。
2. Spring Security 配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(digestEntryPoint()) // 摘要认证入口点
.and()
.addFilter(digestAuthenticationFilter()); // 添加摘要认证过滤器
return http.build();
}
// 配置摘要认证入口点
@Bean
public DigestAuthenticationEntryPoint digestEntryPoint() {
DigestAuthenticationEntryPoint entryPoint = new DigestAuthenticationEntryPoint();
entryPoint.setRealmName("My Digest Realm");
entryPoint.setKey("mySecretKey"); // 用于生成 nonce 的密钥
entryPoint.setNonceValiditySeconds(300); // nonce 有效期(秒)
return entryPoint;
}
// 配置摘要认证过滤器
@Bean
public DigestAuthenticationFilter digestAuthenticationFilter() {
DigestAuthenticationFilter filter = new DigestAuthenticationFilter();
filter.setUserDetailsService(userDetailsService());
filter.setAuthenticationEntryPoint(digestEntryPoint());
return filter;
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password("password") // 密码需以明文存储(或配置密码编码器)
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
3. 关键配置项
• nonce 管理:
• 有效期:entryPoint.setNonceValiditySeconds(300) 控制 nonce 的有效时间。
• 密钥:entryPoint.setKey("mySecretKey") 确保 nonce 的唯一性和防篡改。
• 密码存储:
• 摘要认证要求密码以明文形式存储(或使用可还原的编码方式),以便生成哈希。
三、两种认证的对比
| 特性 | HTTP 基本认证 | HTTP 摘要认证 |
|---|---|---|
| 传输方式 | 用户名密码以 Base64 编码传输 | 使用 MD5 哈希传输摘要,避免明文密码 |
| 安全性 | 低(需 HTTPS 加密) | 中(需 HTTPS 加密,MD5 已不安全) |
| 配置复杂度 | 简单(一行代码启用) | 复杂(需手动配置过滤器和入口点) |
| 适用场景 | 内部工具、快速原型开发 | 旧系统兼容(现代应用推荐 OAuth2/JWT) |
| 密码存储要求 | 支持加密存储(如 BCrypt) | 需明文或可逆加密存储(如 {noop}) |
四、安全建议
- 优先使用 HTTPS:无论选择哪种认证方式,均需启用 TLS 加密。
- 避免使用摘要认证:
MD5已不安全,推荐改用 OAuth2 或 JWT。 - 密码存储安全:
• 基本认证推荐使用强哈希(如 BCrypt):
• 摘要认证需权衡安全性与存储方式。@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - 监控与日志:记录认证失败事件,检测暴力破解行为。
总结
• HTTP 基本认证:快速实现,适合低安全需求场景,需强制 HTTPS。
• HTTP 摘要认证:安全性略高于基本认证,但配置复杂且依赖过时算法,不推荐在新项目中使用。
现代应用应优先考虑 OAuth 2.0、JWT 或 SAML 等更安全的认证协议。


364

被折叠的 条评论
为什么被折叠?



