Go语言结合Redis实现用户登录次数限制功能

 更新时间:2025年09月03日 08:57:36   作者:程序员爱钓鱼  
Redis 的高性能和天然的过期机制,非常适合实现这种登录限流功能,本文将通过 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 main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
    "log"
    "time"
)

var ctx = context.Background()
var rdb *redis.Client

func 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 请求限流
  • 手机验证码发送频率控制

到此这篇关于Go语言结合Redis实现用户登录次数限制功能的文章就介绍到这了,更多相关Go用户登录次数限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang使用swagger的过程详解

    golang使用swagger的过程详解

    这篇文章主要介绍了golang使用swagger的过程详解,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Go语言使用对称加密的示例详解

    Go语言使用对称加密的示例详解

    在项目开发中,我们经常会遇到需要使用对称密钥加密的场景,比如客户端调用接口时,参数包含手机号、身份证号或银行卡号等。本文将详细讲解Go语言使用对称加密的方法,需要的可以参考一下
    2022-06-06
  • goland设置颜色和字体的操作

    goland设置颜色和字体的操作

    这篇文章主要介绍了goland设置颜色和字体的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang goquery selector选择器使用示例大全

    golang goquery selector选择器使用示例大全

    这篇文章主要为大家介绍了golang goquery selector选择器使用示例大全,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go实现并发缓存的示例代码

    Go实现并发缓存的示例代码

    高并发数据存储是现代互联网应用开发中常遇到的一大挑战,本文主要介绍了Go实现并发缓存的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 浅谈go build后加文件和目录的区别

    浅谈go build后加文件和目录的区别

    这篇文章主要介绍了浅谈go build后加文件和目录的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang新提案:panic 能不能加个 PanicError?

    Golang新提案:panic 能不能加个 PanicError?

    这篇文章主要为大家介绍了Golang的新提案关于panic能不能加个PanicError的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go zero微服务框架logx日志组件剖析

    go zero微服务框架logx日志组件剖析

    这篇文章主要为大家介绍了go zero微服务框架logx日志组件剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go中过滤范型集合性能示例详解

    Go中过滤范型集合性能示例详解

    这篇文章主要为大家介绍了Go中过滤范型集合性能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Go实现一个轻量级并发任务调度器(支持限速)

    Go实现一个轻量级并发任务调度器(支持限速)

    本文主要介绍了Go实现一个轻量级并发任务调度器(支持限速),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论