在gin中增加用户登录token验证

By | 2022年2月22日
目录
[隐藏]

要做的就是通过login接口验证用户名密码,验证成功后返回一个token, 访问其他接口都要在header中携带这个token

在gin中要做到这点,需要使用middleware方式

#新增一个Login model

// models/issue.go
// Login struct
type Login struct {
	User     string `form:"user" json:"user" xml:"user" binding:"required"`
	Password string `form:"password" json:"password" xml:"password" binding:"required"`
}

#编写用户登录验证的service

// service/issue.go
// Login function
// @Summary 登录
// @version 1.0
// @Tags login
// @Accept  json
// @Produce  json
// @Param data body models.Login true "login params"
// @Success 200   object models.Result "成功后返回"
// @Router /login [post]
func Login(c *gin.Context) {
	var userInfo models.Login
	if err := c.ShouldBindJSON(&userInfo); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	if userInfo.User != "admin" || userInfo.Password != "123456" {
		c.JSON(http.StatusUnauthorized, gin.H{
			"status":  1,
			"message": "用户名或密码错误",
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"status":  0,
		"message": "登录成功",
		"data": gin.H{
			"user":  "admin",
			"token": "b2nt7cBKPTWVGEPi",
		},
	})
}

#编写验证的函数

创建一个middleware目录,在middleware目录下创建auth.go文件,在auth.go中编写下面的代码

package middleware

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// Auth middleware
func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		authHeader := context.Request.Header.Get("Authorization")
		if authHeader == "" || authHeader != "b2nt7cBKPTWVGEPi" {
			context.JSON(http.StatusUnauthorized, gin.H{
				"stat": 1,
				"msg":  "禁止访问,请检查权限",
			})

			context.Abort()
			return
		}
		context.Next()
	}
}

#修改main中的路由信息

func main() {
	r := gin.Default()

	r.POST("/login", services.Login)

	issue := r.Group("/issue")
	issue.Use(middleware.Auth())
	{
		issue.POST("/add", services.IssueAdd)
		issue.GET("/list", services.IssueList)
		issue.PUT("/update", services.IssueUpdate)
		issue.DELETE("/delete", services.IssueDelete)
		issue.GET("/detail", services.IssueDetail)
	}

	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	//swagger
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	r.Run()
}

说明:

  • 创建一个issue 路由组(Group)
  • 对issue使用中间件Auth(第七行)

#总结

原来以为使用middleware会非常繁琐,没想到写的时候却是很方便,整体流程就是在路由中加个中间件函数,然后在这个中间件函数中做token验证就可以了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注