gin中间件实现鉴权
Contents
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
}
...
}
