当前位置: 首页 > news >正文

Go语言实战案例-Redis实现用户登录次数限制

在登录功能中,如果不加限制,攻击者可能会通过 暴力破解 尝试大量密码组合,带来安全风险。
一个常见解决方案是:在一定时间内限制用户的登录尝试次数,超过次数就锁定一段时间。

Redis 的高性能和天然的过期机制,非常适合实现这种登录限流功能。本文将通过 Go + Redis 实现一个 用户登录次数限制 示例。


一、场景说明

  • • 规则:每个用户 1 分钟内最多尝试登录 5 次
  • • 超过限制:锁定 1 分钟,不允许继续登录
  • • 实现方式
    • • 登录时,在 Redis 中维护一个计数器
    • • 如果计数器超过阈值,就禁止登录

二、环境准备

安装依赖:

go get github.com/redis/go-redis/v9

确保本地或 Docker 中已运行 Redis:

docker run -d -p 6379:6379 redis

三、Redis 工具初始化

package mainimport ("context""fmt""github.com/redis/go-redis/v9""log""time"
)var ctx = context.Background()
var rdb *redis.Clientfunc initRedis() {rdb = redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})if _, err := rdb.Ping(ctx).Result(); err != nil {log.Fatal("Redis 连接失败:", err)}log.Println("Redis 连接成功")
}

四、实现登录次数限制

// CheckLoginLimit 检查用户是否超过登录限制
func CheckLoginLimit(username string) bool {key := fmt.Sprintf("login:%s", username)limit := 5             // 最大尝试次数blockTime := time.Minute // 超过限制后锁定时间// 自增计数器count, err := rdb.Incr(ctx, key).Result()if err != nil {log.Println("Redis 错误:", err)return false}if count == 1 {// 第一次设置过期时间rdb.Expire(ctx, key, blockTime)}if count > int64(limit) {return false // 超过限制}return true
}

五、模拟用户登录逻辑

// MockLogin 模拟登录
func MockLogin(username, password string) {if !CheckLoginLimit(username) {log.Printf("用户 %s 登录失败: 尝试次数过多,请稍后再试\n", username)return}// 假设正确密码是 "123456"if password == "123456" {log.Printf("用户 %s 登录成功\n", username)// 成功后清除计数器rdb.Del(ctx, fmt.Sprintf("login:%s", username))} else {log.Printf("用户 %s 登录失败: 密码错误\n", username)}
}

六、测试效果

func main() {initRedis()for i := 1; i <= 7; i++ {MockLogin("alice", "wrongpass")}
}

运行结果:

用户 alice 登录失败: 密码错误
用户 alice 登录失败: 密码错误
用户 alice 登录失败: 密码错误
用户 alice 登录失败: 密码错误
用户 alice 登录失败: 密码错误
用户 alice 登录失败: 尝试次数过多,请稍后再试
用户 alice 登录失败: 尝试次数过多,请稍后再试

七、总结

通过本案例,我们实现了:

  • • 使用 Redis 存储用户登录尝试次数
  • • 借助 INCR + EXPIRE 实现自动计数和过期清理
  • • 登录成功时清除计数器,避免误封

✅ 应用场景

  • • 登录安全限制(防止暴力破解)
  • • API 请求限流
  • • 手机验证码发送频率控制

http://www.xdnf.cn/news/1443169.html

相关文章:

  • 基于单片机车内换气温度检测空气质量检测系统Proteus仿真(含全部资料)
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • 在 Android MVVM 架构中,获取 ViewModel 的几种方式
  • 微服务的编程测评系统20-虚拟机-nginx-部署
  • 基于Java的瑜伽馆管理系统的设计与实现(代码+数据库+LW)
  • 【LeetCode】21、合并两个有序链表
  • 【设计模式】 装饰模式
  • 【机器学习深度学习】RAG边界处理策略
  • Django REST Framework Serializer 进阶教程
  • word删除指定页面
  • Ubuntu22.04中使用cmake安装abseil-cpp库
  • 【数据分享】283个地级市产业结构合理化水平和产业结构高级化指数(2006-2019)
  • Upload-Labs靶场全20关通关攻略(含原理+实操+环境配置)
  • 利用 Python 绘制环形热力图
  • SuperMap GIS基础产品FAQ集锦(20250819)
  • HTML应用指南:利用POST请求获取全国九号电动车体验店服务店位置信息
  • MyBatis 常见错误与解决方案:从坑中爬出的实战指南
  • 时序数据库选型指南:Apache IoTDB快速部署与实战应用
  • powershell实现,user权限下给软件提取。
  • 数学家破解世界难题——拒绝领奖拒绝百万奖金
  • AV-NeRF、AV-GS、AV-Surf论文解读
  • 基于数据挖掘的当代不孕症医案证治规律研究
  • C# Activator.GetObject 原理与示例:理解.NET Remoting远程调用
  • AI 时代零售数据底座怎么建?首份《零售一体化云数据库白皮书》发布
  • 强化微调:以Swift框架进行GRPO多模态模型强化微调为例
  • 【明道云】[工作表控件5] 手机控件的格式化处理
  • 在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
  • 云手机中的三大核心技术主要是指什么?
  • Docker部署Lunalytics开源监控工具
  • 开源检索增强生成(UltraRAG)框架