欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言結(jié)合Redis實現(xiàn)用戶登錄次數(shù)限制功能

 更新時間:2025年09月03日 08:57:36   作者:程序員愛釣魚  
Redis 的高性能和天然的過期機制,非常適合實現(xiàn)這種登錄限流功能,本文將通過 Go + Redis 實現(xiàn)一個 用戶登錄次數(shù)限制 示例,感興趣的小伙伴可以了解下

在登錄功能中,如果不加限制,攻擊者可能會通過 暴力 破解 嘗試大量密碼組合,帶來安全風(fēng)險。

一個常見解決方案是:在一定時間內(nèi)限制用戶的登錄嘗試次數(shù),超過次數(shù)就鎖定一段時間。

Redis 的高性能和天然的過期機制,非常適合實現(xiàn)這種登錄限流功能。本文將通過 Go + Redis 實現(xiàn)一個 用戶登錄次數(shù)限制 示例。

一、場景說明

規(guī)則:每個用戶 1 分鐘內(nèi)最多嘗試登錄 5 次

超過限制:鎖定 1 分鐘,不允許繼續(xù)登錄

實現(xiàn)方式

  • 登錄時,在 Redis 中維護一個計數(shù)器
  • 如果計數(shù)器超過閾值,就禁止登錄

二、環(huán)境準(zhǔn)備

安裝依賴:

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 連接成功")
}

四、實現(xiàn)登錄次數(shù)限制

// CheckLoginLimit 檢查用戶是否超過登錄限制
func CheckLoginLimit(username string) bool {
    key := fmt.Sprintf("login:%s", username)
    limit := 5             // 最大嘗試次數(shù)
    blockTime := time.Minute // 超過限制后鎖定時間

    // 自增計數(shù)器
    count, err := rdb.Incr(ctx, key).Result()
    if err != nil {
        log.Println("Redis 錯誤:", err)
        return false
    }

    if count == 1 {
        // 第一次設(shè)置過期時間
        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 登錄失敗: 嘗試次數(shù)過多,請稍后再試\n", username)
        return
    }

    // 假設(shè)正確密碼是 "123456"
    if password == "123456" {
        log.Printf("用戶 %s 登錄成功\n", username)
        // 成功后清除計數(shù)器
        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")
    }
}

運行結(jié)果:

用戶 alice 登錄失敗: 密碼錯誤
用戶 alice 登錄失敗: 密碼錯誤
用戶 alice 登錄失敗: 密碼錯誤
用戶 alice 登錄失敗: 密碼錯誤
用戶 alice 登錄失敗: 密碼錯誤
用戶 alice 登錄失敗: 嘗試次數(shù)過多,請稍后再試
用戶 alice 登錄失敗: 嘗試次數(shù)過多,請稍后再試

七、總結(jié)

通過本案例,我們實現(xiàn)了:

  • 使用 Redis 存儲用戶登錄嘗試次數(shù)
  • 借助 INCR + EXPIRE 實現(xiàn)自動計數(shù)和過期清理
  • 登錄成功時清除計數(shù)器,避免誤封

應(yīng)用場景

  • 登錄安全限制(防止暴力 破解)
  • API 請求限流
  • 手機驗證碼發(fā)送頻率控制

到此這篇關(guān)于Go語言結(jié)合Redis實現(xiàn)用戶登錄次數(shù)限制功能的文章就介紹到這了,更多相關(guān)Go用戶登錄次數(shù)限制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中g(shù)oto跳轉(zhuǎn)語句的實現(xiàn)

    Golang中g(shù)oto跳轉(zhuǎn)語句的實現(xiàn)

    本文主要介紹了Golang中g(shù)oto跳轉(zhuǎn)語句的實現(xiàn),包括標(biāo)簽的定義、跳轉(zhuǎn)語句的使用、作用域限制、避免濫用的原因以及歷史遺留代碼中的使用情況,感興趣的可以了解一下
    2025-03-03
  • Go語言中函數(shù)的使用方法詳解

    Go語言中函數(shù)的使用方法詳解

    這篇文章主要為大家詳細介紹了Go語言中函數(shù)的使用方法的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,感興趣的可以了解一下
    2023-04-04
  • Golang超全面講解并發(fā)

    Golang超全面講解并發(fā)

    goroutine?不是os線程、不是綠色線程(由語言運行時管理的線程),是協(xié)程。協(xié)程是一種非搶占式的簡單并發(fā)子goroutine(函數(shù)、閉包或方法),也就是說,它們不能被中斷。取而代之的是,協(xié)程有多個點,允許暫?;蛑匦逻M入?—Go語言并發(fā)之道
    2022-06-06
  • GoFrame 框架緩存查詢結(jié)果的示例詳解

    GoFrame 框架緩存查詢結(jié)果的示例詳解

    GoFrame的gdb對查詢結(jié)果的緩存處理是不是非常的優(yōu)雅。尤其是*gcache.Cache對象采用了適配器設(shè)計模式,可以輕松實現(xiàn)從單進程內(nèi)存緩存切換為分布式的Redis緩存,本文重點給大家介紹GoFrame 如何優(yōu)雅的緩存查詢結(jié)果,感興趣的朋友一起看看吧
    2022-06-06
  • Go語言中如何通過方法為類型添加行為

    Go語言中如何通過方法為類型添加行為

    這篇文章主要介紹了Go語言中如何通過方法為類型添加行為的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束

    詳解Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束

    這篇文章主要為大家詳細介紹了Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2024-02-02
  • 使用go mod導(dǎo)入本地自定義包問題

    使用go mod導(dǎo)入本地自定義包問題

    這篇文章主要介紹了使用go mod導(dǎo)入本地自定義包問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • go語言實現(xiàn)簡易比特幣系統(tǒng)之交易簽名及校驗功能

    go語言實現(xiàn)簡易比特幣系統(tǒng)之交易簽名及校驗功能

    這篇文章主要介紹了go語言實現(xiàn)簡易比特幣系統(tǒng)之交易簽名及校驗功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Go語言使用templ實現(xiàn)編寫HTML用戶界面

    Go語言使用templ實現(xiàn)編寫HTML用戶界面

    templ是一個在 Go 中編寫 HTML 用戶界面的語言,使用 templ,我們可以創(chuàng)建可呈現(xiàn) HTML 片段的組件,下面就跟隨小編一起了解一下具體的實現(xiàn)方法吧
    2023-12-12
  • Go語言copy()實現(xiàn)切片復(fù)制

    Go語言copy()實現(xiàn)切片復(fù)制

    本文主要介紹了Go語言copy()實現(xiàn)切片復(fù)制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論