fix(server): 限流 fail-close 默认开启 + 配置测试
生产安全:Redis 不可达时默认拒绝请求(503)而非放行。 - config/default.toml: fail_close 默认值 false → true - config.rs: Default + serde default 均改为 true - 新增 2 个单元测试验证默认值和 serde 行为
This commit is contained in:
@@ -54,6 +54,6 @@ upload_dir = "./uploads"
|
|||||||
max_file_size = "10MB"
|
max_file_size = "10MB"
|
||||||
|
|
||||||
[rate_limit]
|
[rate_limit]
|
||||||
# Redis 不可达时是否拒绝请求。生产环境必须设置为 true。
|
# Redis 不可达时是否拒绝请求(fail-close)。默认 true = 安全优先。
|
||||||
# 可通过 ERP__RATE_LIMIT__FAIL_CLOSE=true 环境变量覆盖。
|
# 开发环境可设为 false 以避免 Redis 依赖:ERP__RATE_LIMIT__FAIL_CLOSE=false
|
||||||
fail_close = false
|
fail_close = true
|
||||||
|
|||||||
@@ -127,14 +127,18 @@ impl StorageConfig {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
pub struct RateLimitConfig {
|
pub struct RateLimitConfig {
|
||||||
/// Redis 不可达时是否拒绝请求(生产环境必须为 true)。
|
/// Redis 不可达时是否拒绝请求。默认 true(安全优先)。
|
||||||
#[serde(default)]
|
#[serde(default = "default_fail_close")]
|
||||||
pub fail_close: bool,
|
pub fail_close: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn default_fail_close() -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for RateLimitConfig {
|
impl Default for RateLimitConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self { fail_close: false }
|
Self { fail_close: true }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,3 +158,20 @@ impl AppConfig {
|
|||||||
Ok(app_config)
|
Ok(app_config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rate_limit_default_is_fail_close() {
|
||||||
|
let config = RateLimitConfig::default();
|
||||||
|
assert!(config.fail_close, "RateLimitConfig 默认应为 fail_close = true");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serde_default_uses_custom_fn() {
|
||||||
|
let config: RateLimitConfig = serde_json::from_str("{}").unwrap();
|
||||||
|
assert!(config.fail_close, "serde 反序列化缺失字段时应使用 default_fail_close() = true");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user