golang利用redis和gin實(shí)現(xiàn)保存登錄狀態(tài)校驗(yàn)登錄功能
保存用戶登錄狀態(tài),一般常用的方式有兩種
一、生成token,然后token保存到數(shù)據(jù)庫用戶表里面,每次登錄的時(shí)候,自動(dòng)更新,容納后每次用的時(shí)候,去取出來校驗(yàn),這種方式,數(shù)據(jù)庫壓力大,而且不是很靈活
二、每次登錄生成token,然后token保存到Redis緩存中,每次都去校驗(yàn),不僅快速,而且,數(shù)據(jù)庫壓力也小
1.啟動(dòng)時(shí)候,加載Redis項(xiàng)
2、Redis(附帶參數(shù)文件)
前期準(zhǔn)備工作好之后
1、路由,利用路由文件,添加中間件,將所有需要驗(yàn)證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è)置需要登錄驗(yàn)證的一些函數(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驗(yàn)證中間件 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": "請(qǐng)攜帶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": "登錄失效,請(qǐng)重新登錄!", }) c.Abort() return } } }
具體的token組裝方式,自己確定,我這邊采用的是固定字符串+user_id的方式,
token可以由body中傳,也可以由header中傳
效果
無token:
token錯(cuò)誤:
token正確
到此這篇關(guān)于golang利用redis和gin實(shí)現(xiàn)保存登錄狀態(tài),校驗(yàn)登錄的文章就介紹到這了,更多相關(guān)golang校驗(yàn)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)
按行讀取文件相較于一次性載入,有著很多優(yōu)勢,如內(nèi)存效率高、處理速度快、實(shí)時(shí)性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對(duì)大家有所幫助2024-02-02使用Golang實(shí)現(xiàn)Sm2加解密的代碼詳解
本文主要介紹了Go語言實(shí)現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03