Contents

gin中间件实现鉴权

web应用中的鉴权是硬性需求。

我用jwt-go库(虽然作者停止了更新)做JSON Web Token(JWT)。怎么使用jwt-go库,看这篇文章Go 鉴权(三):JWT

怎么用gin中间件实现鉴权拦截:

一、先写一个函数:

func Auth() gin.HandlerFunc {
    return func(ginContext *gin.Context) {
        //CheckJwt是解码得到对象信息
        err, user := CheckJwt(ginContext)
        if err != nil {
            //如果有错误就中止并返回错误信息给前端,这里都是伪代码
            response.Err(ginContext, response.ErrUnknown)
            ginContext.Abort()
            return
        }
        //如果鉴权成功,给上下文context设置用户信息,在下游中可以使用这个【auth-user】对象信息
        ginContext.Set("auth-user", user)
        ginContext.Next()
    }
}

二、在某个路由组中实现鉴权:

group := ginEngine.Group("/api/user")
group.Use(Auth()) //用中间件方式对一个路由组做鉴权

其实也可以对某个路由做鉴权:

group := ginEngine.Group("/api/user")
group.GET("/info", GetUserInfo, Auth()) //指定某个路由做鉴权

可以在下游的对象中得到用户的鉴权信息

func GetUserInfo(ginContext *gin.Context) {
  userId := ""
  user, ok := ginContext.Get("auth-user")
  if ok {
    userId = user.(User).Id //在上游的鉴权设置用户对象之后,得到用户id
  }
  ...
}