login-guard-statemachine
靶子 BASE=http://localhost:20098 (PW_BASE_URL 显式指定)
=== G1 阈值边界:7 次真实失败 + 1 次错误验证码 ⇒ 不锁 ===
PASS G1-a 错误验证码返回 CAPTCHA_INVALID(实得 "CAPTCHA_INVALID")
PASS G1-b 该请求本身未返回锁定
PASS G1-c 🔴 账号未被错误验证码推入硬锁(实得 "请输入验证码")
=== G2 反向守卫:承接 G1,第 8 次真实密码失败 ⇒ 必须锁定 ===
PASS G2-a 🔴 第 8 次真实失败仍触发硬锁(暴破上限未放松)
PASS G2-b 锁定时长仍为 900 秒
=== G3 并发堆叠:2 次真实失败 + 32 并发错误验证码 ⇒ 不锁 ===
PASS G3-a 并发突发中零锁定响应(实得 0/32)
PASS G3-b 🔴 突发后账号未被锁(实得 "请输入验证码")
PASS G3-c 仍停在"要验证码"这一档,计数未被并发污染(实得 "CAPTCHA_REQUIRED")
=== G4 纵深:超长 code 被拒且不消耗验证码 ===
PASS G4-a 超长 code 被拒(实得 "CAPTCHA_INVALID")
PASS G4-b 超长入参未消耗该验证码,同 id + 正确答案仍能过闸(实得 "用户名或密码错误")
=== G5 守卫:真实账号正确密码仍可登录并清账 ===
FAIL G5-a 正确验证码 + 正确密码 → 签发 token(实得 "")
PASS G5-b 登录成功已清账:下一次失败不再立刻要验证码
=== G6 scope 隔离 ===
PASS G6-a DDM 侧已进入"要验证码"档
PASS G6-b SucaiManager 侧同名账号不受影响(scope 分桶)
=== G7 SucaiManager 阈值边界(与 G1 同构)===
PASS G7-a 错误验证码返回 CAPTCHA_INVALID(实得 "CAPTCHA_INVALID")
PASS G7-b 🔴 SucaiManager 账号未被错误验证码推入硬锁(实得 "请输入验证码")
PASS=15 FAIL=1
失败项:
- G5-a 正确验证码 + 正确密码 → 签发 token(实得 "")