Go Gin 从中间件设置和访问上下文值

我正在尝试在中间件中设置我的用户上下文,然后尝试检查用户是否在其他处理程序函数中具有权限。但是由于某种原因,当我尝试从上下文访问用户时,它会以 nils 的形式返回。中间件代码似乎正在工作,当我传递一个有效的 jwt 令牌时,它显示用户正在中间件函数的上下文中设置。但是一旦我点击 getCurrentUser 函数,它就会说它为零。


这是代码:中间件


// Middleware wraps the request with auth middleware

func Middleware(path string, sc *cfg.Server, orm *orm.ORM) gin.HandlerFunc {

    logger.Info("[Auth.Middleware] Applied to path: ", path)

    return gin.HandlerFunc(func(c *gin.Context) {

        t, err := ParseToken(c, sc)

        if err != nil {

            authError(c, err)

        } else {

            if claims, ok := t.Claims.(jwt.MapClaims); ok {

                if claims["exp"] != nil {

                    issuer := claims["iss"].(string)

                    userid := claims["jti"].(string)

                    email := claims["email"].(string)

                    if claims["aud"] != nil {

                        audiences := claims["aud"].(interface{})

                        logger.Warnf("\n\naudiences: %s\n\n", audiences)

                    }

                    if claims["alg"] != nil {

                        algo := claims["alg"].(string)

                        logger.Warnf("\n\nalgo: %s\n\n", algo)

                    }

                    if user, err := orm.FindUserByJWT(email, issuer, userid); err != nil {

                        authError(c, ErrForbidden)

                    } else {

                        if user != nil {

                            c.Request = addToContext(c, consts.ProjectContextKeys.UserCtxKey, user)

                            logger.Debug("User: ", user.ID)

                        }

                        c.Next()

                    }

                } else {

                    authError(c, ErrMissingExpField)

                }

            } else {

                authError(c, err)

            }

        }

    })

}


LEATH
浏览 92回答 1
1回答

翻过高山走不出你

问题是您将用户存储在一个上下文中,但随后您尝试从另一个上下文中检索用户。value*gin.Context和 value*gin.Context.Request.Context是两个独立的上下文值。您正在使用请求的上下文来存储用户:c.Request.WithContext(context.WithValue(c.Request.Context(), key, value))然后您使用 gin 上下文来检索用户:func getCurrentUser(ctx context.Context) *dbm.User {    cu := ctx.Value(utils.ProjectContextKeys.UserCtxKey).(*dbm.User)    // ...func Get(orm *orm.ORM) gin.HandlerFunc {    return func(ctx *gin.Context) {        cu := getCurrentUser(ctx) // here you're passing *gin.Context to the function.        // ...因此,要解决这个问题,将传递给getCurrentUser调用的值更改为:func Get(orm *orm.ORM) gin.HandlerFunc {    return func(ctx *gin.Context) {        cu := getCurrentUser(ctx.Request.Context())        if ok, err := cu.HasPermission(consts.Permissions.Create, consts.EntityNames.Users); !ok || err != nil {            ctx.String(http.StatusUnauthorized, "BAD")        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go