From 34504d4179a08ba1351b3ff2ef773af89eae0842 Mon Sep 17 00:00:00 2001 From: iven Date: Sun, 3 May 2026 19:37:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(server):=20=E9=99=90=E6=B5=81=20fail-close?= =?UTF-8?q?=20=E9=BB=98=E8=AE=A4=E5=BC=80=E5=90=AF=20+=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 生产安全:Redis 不可达时默认拒绝请求(503)而非放行。 - config/default.toml: fail_close 默认值 false → true - config.rs: Default + serde default 均改为 true - 新增 2 个单元测试验证默认值和 serde 行为 --- crates/erp-server/config/default.toml | 6 +++--- crates/erp-server/src/config.rs | 27 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/crates/erp-server/config/default.toml b/crates/erp-server/config/default.toml index 8f03249..c704243 100644 --- a/crates/erp-server/config/default.toml +++ b/crates/erp-server/config/default.toml @@ -54,6 +54,6 @@ upload_dir = "./uploads" max_file_size = "10MB" [rate_limit] -# Redis 不可达时是否拒绝请求。生产环境必须设置为 true。 -# 可通过 ERP__RATE_LIMIT__FAIL_CLOSE=true 环境变量覆盖。 -fail_close = false +# Redis 不可达时是否拒绝请求(fail-close)。默认 true = 安全优先。 +# 开发环境可设为 false 以避免 Redis 依赖:ERP__RATE_LIMIT__FAIL_CLOSE=false +fail_close = true diff --git a/crates/erp-server/src/config.rs b/crates/erp-server/src/config.rs index e30ec28..c2035fd 100644 --- a/crates/erp-server/src/config.rs +++ b/crates/erp-server/src/config.rs @@ -127,14 +127,18 @@ impl StorageConfig { #[derive(Debug, Clone, Deserialize)] pub struct RateLimitConfig { - /// Redis 不可达时是否拒绝请求(生产环境必须为 true)。 - #[serde(default)] + /// Redis 不可达时是否拒绝请求。默认 true(安全优先)。 + #[serde(default = "default_fail_close")] pub fail_close: bool, } +fn default_fail_close() -> bool { + true +} + impl Default for RateLimitConfig { fn default() -> Self { - Self { fail_close: false } + Self { fail_close: true } } } @@ -154,3 +158,20 @@ impl AppConfig { 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"); + } +}