golang利用redis和gin實現(xiàn)保存登錄狀態(tài)校驗登錄功能
保存用戶登錄狀態(tài),一般常用的方式有兩種
一、生成token,然后token保存到數(shù)據(jù)庫用戶表里面,每次登錄的時候,自動更新,容納后每次用的時候,去取出來校驗,這種方式,數(shù)據(jù)庫壓力大,而且不是很靈活
二、每次登錄生成token,然后token保存到Redis緩存中,每次都去校驗,不僅快速,而且,數(shù)據(jù)庫壓力也小
1.啟動時候,加載Redis項

2、Redis(附帶參數(shù)文件)


前期準備工作好之后
1、路由,利用路由文件,添加中間件,將所有需要驗證token的接口放一起
比如前端要訪問的接口是“api/index/index”
package router
import (
"fmt"
"github.com/gin-gonic/gin"
"hexiao/service"
)
func Router() *gin.Engine {
r := gin.Default()
//修改密碼
r.POST("api/user/changepwd", service.ChangePwd)
//登錄
r.POST("api/user/login", service.Login)
//設置需要登錄驗證的一些函數(shù)
IndexGroup := r.Group("/api/index")
{
//調(diào)用中間件
IndexGroup.Use(service.AuthMiddleWare())
IndexGroup.POST("/index", service.IndexInfo)
}
return r
}中間件控制
//token存入redis部分代碼
token := "xxxxxxxxxxxxxx"
ctx := context.Background()
userID := "online_" + fmt.Sprintf("%d", adminuser2.Id)
time2 := time.Duration(viper.GetInt("timeout.RedisOnlineTime")) * time.Hour
err := utils.Red.Set(ctx, userID, token, time2)
if err != nil {
fmt.Println("set err=", err)
}
//取token驗證中間件
func AuthMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
ctx := context.Background()
userid1 := c.PostForm("user_id")
token := c.PostForm("token")
if token == "" {
c.JSON(200, gin.H{
"code": 300,
"data": "",
"msg": "請攜帶token!",
})
c.Abort()
return
}
userID := "online_" + userid1
r, err := utils.Red.Get(ctx, userID).Result()
if err != nil {
fmt.Println("err>>>>>>", err)
}
if r != token {
c.JSON(200, gin.H{
"code": 300,
"data": "",
"msg": "登錄失效,請重新登錄!",
})
c.Abort()
return
}
}
}具體的token組裝方式,自己確定,我這邊采用的是固定字符串+user_id的方式,
token可以由body中傳,也可以由header中傳
效果
無token:

token錯誤:

token正確

到此這篇關于golang利用redis和gin實現(xiàn)保存登錄狀態(tài),校驗登錄的文章就介紹到這了,更多相關golang校驗登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang實現(xiàn)按行讀取文件的方法小結(jié)
按行讀取文件相較于一次性載入,有著很多優(yōu)勢,如內(nèi)存效率高、處理速度快、實時性高等,本文主要介紹了Golang按行讀取文件的相關方法,希望對大家有所幫助2024-02-02

