golang利用redis和gin实现保存登录状态校验登录功能

 更新时间:2024年01月20日 14:15:50   作者:牧童牵黄牛  
这篇文章主要介绍了golang利用redis和gin实现保存登录状态校验登录功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

保存用户登录状态,一般常用的方式有两种

一、生成token,然后token保存到数据库用户表里面,每次登录的时候,自动更新,容纳后每次用的时候,去取出来校验,这种方式,数据库压力大,而且不是很灵活

二、每次登录生成token,然后token保存到Redis缓存中,每次都去校验,不仅快速,而且,数据库压力也小

1.启动时候,加载Redis项

2、Redis(附带参数文件)

前期准备工作好之后

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)
	//设置需要登录验证的一些函数
	IndexGroup := r.Group("/api/index")
	{
		//调用中间件
		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实现保存登录状态,校验登录的文章就介绍到这了,更多相关golang校验登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO中sync包自由控制并发示例详解

    GO中sync包自由控制并发示例详解

    这篇文章主要为大家介绍了GO中sync包自由控制并发示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言连接Oracle数据库的方法

    Go语言连接Oracle数据库的方法

    这篇文章主要介绍了Go语言连接Oracle数据库的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • go zero微服务高在请求量下如何优化

    go zero微服务高在请求量下如何优化

    这篇文章主要为大家介绍了go zero微服务高在请求量下的优化处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang跨平台GUI框架Fyne的使用教程详解

    Golang跨平台GUI框架Fyne的使用教程详解

    Go 官方没有提供标准的 GUI 框架,在 Go 实现的几个 GUI 库中,Fyne 算是最出色的,它有着简洁的API、支持跨平台能力,且高度可扩展,下面我们就来看看它的具体使用吧
    2024-03-03
  • Golang跳转语句continue与goto使用语法详解

    Golang跳转语句continue与goto使用语法详解

    这篇文章主要介绍了Golang跳转语句continue与goto使用语法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Golang自定义结构体转map的操作

    Golang自定义结构体转map的操作

    这篇文章主要介绍了Golang自定义结构体转map的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go设计模式之生成器模式详细讲解

    Go设计模式之生成器模式详细讲解

    生成器模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要功能是构建复杂的产品,而且是细化地、分步骤地构建产品,也就是说生成器模式重在一步一步解决构建复杂对象的问题
    2023-01-01
  • Golang range slice 与range array 之间的区别

    Golang range slice 与range array 之间的区别

    这篇文章主要介绍了Golang range slice 与range array 之间的区别,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 使用Go语言实现简单聊天系统

    使用Go语言实现简单聊天系统

    本文介绍了如何使用Go语言和WebSocket技术构建一个简单的多人聊天室系统,包括客户端连接管理、消息广播和并发处理,最后,通过编写main.go、hub.go和client.go等核心代码模块,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • Go语言读取文本文件的三种方式总结

    Go语言读取文本文件的三种方式总结

    工作中时不时需要读取文本,文本文件是最常见的文件类型。本文将利用Go语言从逐行、逐个单词和逐个字符三个方法读取文件,感兴趣的可以了解一下
    2023-01-01

最新评论