Go語言結(jié)合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),包括標(biāo)簽的定義、跳轉(zhuǎn)語句的使用、作用域限制、避免濫用的原因以及歷史遺留代碼中的使用情況,感興趣的可以了解一下2025-03-03
詳解Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束
這篇文章主要為大家詳細介紹了Golang如何監(jiān)聽某個函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2024-02-02
go語言實現(xiàn)簡易比特幣系統(tǒng)之交易簽名及校驗功能
這篇文章主要介紹了go語言實現(xiàn)簡易比特幣系統(tǒng)之交易簽名及校驗功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

