系统级用户维度登录失败冻结机制设计方案(管理端为主)

本方案与 IP 维度限制不同,属于【用户账号维度】的安全控制: 当某一用户连续登录失败超过 3 次时,立即冻结该账号,30 分钟内禁止任何登录尝试。 同时支持“通过邮箱找回密码自动解冻”的反恶意冻结机制,并全程审计留痕。


一、核心规则定义

1. 冻结触发规则

  • 同一用户账号:

    • 连续登录失败次数 > 3 次
    • 失败次数必须为“连续失败”,中途若成功登录则清零
  • 满足条件后:

    • 立即冻结账户
    • 冻结时长:30 分钟
    • 冻结期间:

      • 禁止登录
      • 返回明确提示:账号已被冻结 + 剩余解封时间

2. 解冻规则

解冻方式包括:

  1. 自动解冻

    • 冻结时间到期后,系统自动解锁
  2. 主动解冻(邮箱找回密码)

    • 用户完成邮箱验证码验证 + 修改密码成功后
    • 系统立即解除冻结状态
    • 本次解冻行为作为独立事件记录到冻结记录表

二、防恶意冻结策略

为避免攻击者使用错误密码故意冻结他人账号:

  • 冻结前需满足:

    • 连续失败(非累计)
    • 可增加最小时间间隔阈值(如 3 次失败需在 5 分钟内)
  • 冻结后允许通过邮箱验证解除
  • 冻结行为记录可用于异常审计

三、冻结记录表设计(核心审计表)

表名建议:user_login_freeze_record

冻结与解冻共用一张表,通过 event_type 区分

必含基础字段(按你的规范)

字段名 类型 说明
id bigint(20) 主键
status tinyint(4) 状态:1-有效 0-无效
create_time datetime(3) 创建时间
update_time datetime(3) 更新时间
creator_id bigint(20) 创建人
updater_id bigint(20) 更新人
delete_flag tinyint(4) 逻辑删除

业务扩展建议字段

字段 类型 说明
user_id bigint 用户ID
username varchar(128) 登录账号
event_type tinyint 1-冻结 2-解冻
trigger_type tinyint 1-连续失败 2-邮箱解锁 3-管理员解锁 4-自动解冻
freeze_start_time datetime 冻结开始时间
freeze_end_time datetime 预计解冻时间
actual_unfreeze_time datetime 实际解冻时间
fail_count int 连续失败次数
client_ip varchar(64) 最近失败 IP
user_agent varchar(512) 设备信息
remark varchar(512) 说明

📌 设计要点:

  • 一次冻结 + 一次解冻 = 两条记录
  • 解冻操作必须关联最近一次冻结记录

四、登录状态模型设计

建议账号增加安全状态字段:

字段 说明
login_fail_count 当前连续失败次数
last_fail_time 最近失败时间
is_frozen 是否冻结
frozen_until 冻结截止时间

状态流转:

正常 → 连续失败3次 → 冻结 → 自动/邮箱解冻 → 正常


五、登录流程控制逻辑(用户维度)

登录流程关键判断顺序:

  1. 判断账户是否冻结

    • 若冻结且未到期:直接拒绝
  2. 验证账号密码
  3. 成功:

    • 清空失败计数
  4. 失败:

    • fail_count +1
    • 若 > 3 :触发冻结逻辑

六、管理员管理功能设计

1. 功能模块规划

模块名称:账号冻结管理

功能点包括:

  • 冻结记录列表
  • 冻结详情查看
  • 手动解冻账号
  • 冻结策略配置
  • 冻结统计报表

2. 管理端页面结构

✅ 冻结记录列表

字段展示:

  • 用户ID
  • 登录账号
  • 事件类型(冻结 / 解冻)
  • 触发方式
  • 连续失败次数
  • 冻结开始时间
  • 预计解冻时间
  • 实际解冻时间
  • IP
  • 设备信息
  • 状态

操作:

  • 查看详情
  • 立即解冻

✅ 冻结详情页

展示:

  • 用户基本信息
  • 冻结原因
  • 失败历史
  • 登录行为轨迹
  • 冻结/解冻历史

✅ 冻结策略配置页

可配置项:

  • 连续失败次数阈值(默认3)
  • 冻结时长(默认30分钟)
  • 是否启用邮箱解锁
  • 是否启用管理员解锁

七、管理员交互流程

  1. 管理员进入 “账号冻结管理”
  2. 查看冻结列表
  3. 点击某账号:

    • 查看冻结原因及相关历史
  4. 可执行操作:

    • 立即解冻
    • 延长冻结时间
    • 标记异常

操作行为自动写入冻结记录表


八、用户侧体验(无需独立页面)

用户侧仅表现为:

  • 登录失败提示:

    • “登录失败,连续失败3次将冻结账号”
  • 冻结提示:

    • “账号已被冻结,请30分钟后再尝试或通过邮箱找回密码解锁”

不提供冻结记录查看页面


九、API 设计拆分建议

管理端 Controller

  • AdminUserFreezeController

    • 查询冻结记录
    • 手动解冻
    • 冻结策略配置

登录安全 Controller

  • LoginSecurityController

    • 登录失败记录
    • 冻结状态校验

职责清晰,避免混用


十、符合你给出的开发规范说明

✅ 不涉及具体代码实现 ✅ 可复用现有工具类 ✅ 支持模块高内聚 ✅ 管理端与用户端接口分离 ✅ 前端 Vue3 组件化 ✅ 适配现有 MyBatis XML 规范


总结

这个方案构建的是:

一个完整的“用户登录安全防暴力尝试系统”,具备: