系统级用户维度登录失败冻结机制设计方案(管理端为主)
本方案与 IP 维度限制不同,属于【用户账号维度】的安全控制: 当某一用户连续登录失败超过 3 次时,立即冻结该账号,30 分钟内禁止任何登录尝试。 同时支持“通过邮箱找回密码自动解冻”的反恶意冻结机制,并全程审计留痕。
一、核心规则定义
1. 冻结触发规则
-
同一用户账号:
- 连续登录失败次数 > 3 次
- 失败次数必须为“连续失败”,中途若成功登录则清零
-
满足条件后:
- 立即冻结账户
- 冻结时长:30 分钟
-
冻结期间:
- 禁止登录
- 返回明确提示:账号已被冻结 + 剩余解封时间
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次 → 冻结 → 自动/邮箱解冻 → 正常
五、登录流程控制逻辑(用户维度)
登录流程关键判断顺序:
-
判断账户是否冻结
- 若冻结且未到期:直接拒绝
- 验证账号密码
-
成功:
- 清空失败计数
-
失败:
- fail_count +1
- 若 > 3 :触发冻结逻辑
六、管理员管理功能设计
1. 功能模块规划
模块名称:账号冻结管理
功能点包括:
- 冻结记录列表
- 冻结详情查看
- 手动解冻账号
- 冻结策略配置
- 冻结统计报表
2. 管理端页面结构
✅ 冻结记录列表
字段展示:
- 用户ID
- 登录账号
- 事件类型(冻结 / 解冻)
- 触发方式
- 连续失败次数
- 冻结开始时间
- 预计解冻时间
- 实际解冻时间
- IP
- 设备信息
- 状态
操作:
- 查看详情
- 立即解冻
✅ 冻结详情页
展示:
- 用户基本信息
- 冻结原因
- 失败历史
- 登录行为轨迹
- 冻结/解冻历史
✅ 冻结策略配置页
可配置项:
- 连续失败次数阈值(默认3)
- 冻结时长(默认30分钟)
- 是否启用邮箱解锁
- 是否启用管理员解锁
七、管理员交互流程
- 管理员进入 “账号冻结管理”
- 查看冻结列表
-
点击某账号:
- 查看冻结原因及相关历史
-
可执行操作:
- 立即解冻
- 延长冻结时间
- 标记异常
操作行为自动写入冻结记录表
八、用户侧体验(无需独立页面)
用户侧仅表现为:
-
登录失败提示:
- “登录失败,连续失败3次将冻结账号”
-
冻结提示:
- “账号已被冻结,请30分钟后再尝试或通过邮箱找回密码解锁”
不提供冻结记录查看页面
九、API 设计拆分建议
管理端 Controller
-
AdminUserFreezeController
- 查询冻结记录
- 手动解冻
- 冻结策略配置
登录安全 Controller
-
LoginSecurityController
- 登录失败记录
- 冻结状态校验
职责清晰,避免混用
十、符合你给出的开发规范说明
✅ 不涉及具体代码实现 ✅ 可复用现有工具类 ✅ 支持模块高内聚 ✅ 管理端与用户端接口分离 ✅ 前端 Vue3 组件化 ✅ 适配现有 MyBatis XML 规范
总结
这个方案构建的是:
一个完整的“用户登录安全防暴力尝试系统”,具备:
