JWT权限验证中间件的使用 | 青训营笔记

341 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。

在Gin框架中,我们在处理请求时可以加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件。中间件可以用来处理一些公共的业务逻辑,例如登录验证,耗时记录。

中间件的定义

Go语言的中间件必须是一个gin.HandlerFunc类型。例如下面的代码是一个简单的jwt登录验证的中间件。

func JwtAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Query("token")
		if token == "" {
			c.JSON(http.StatusOK, Response{
				1,
				"未登录或非法访问",
			})
			log.Info("未登录或非法访问")
			c.Abort()
			return
		}
                c.Set("claims", claims)
		c.Next()
        }
}

中间件的主要函数

c.Abort()

这个函数会直接跳过后面要执行的内容,例如权限认证失败,就不能进行后序操作。

c.Next()

先执行后面的内容,执行过后面的返回执行当前内容。

中间件的注册

中间件注册需要在路由中填写对应的中间件,在其他业务处理时就会先调用中间件业务。

为全局路由注册

func main() {
	r.Static("/static", "./public")
	r.Use(middleware.JwtAuth())
	r.GET("/douyin", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello world!",
		})
	})
	r.Run()
}

为单个路由注册

apiRouter.POST("/comment/action/", middleware.JwtAuth(), controller.CommentAction)

为路由组注册

relation := apiRouter.Group("/relation")
{
        relation.Use(middleware.JwtAuth())
        relation.POST("/action/", controller.RelationAction)
        relation.GET("/follow/list/", controller.FollowList)
        relation.GET("/follower/list/", controller.FollowerList)
        relation.GET("/friend/list/", controller.FriendList)
}

中间件注意事项

gin.Default()默认使用了LoggerRecovery中间件,其中:

Logger中间件将日志写入gin.DefaultWriter

Recovery中间件会recover任何panic。如果有panic的话,会写入500响应码。

如果不想使用上面两个默认的中间件,可以使用gin.New()新建一个没有任何默认中间件的路由。

一般情况使用默认的即可。