为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
LEATH 2022-05-18 16:06:56
我正在尝试在中间件中设置我的用户上下文,然后尝试检查用户是否在其他处理程序函数中具有权限。但是由于某种原因,当我尝试从上下文访问用户时,它会以 nils 的形式返回。中间件代码似乎正在工作,当我传递一个有效的 jwt 令牌时,它显示用户正在中间件函数的上下文中设置。但是一旦我点击 getCurrentUser 函数,它就会说它为零。这是代码:中间件// Middleware wraps the request with auth middlewarefunc 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)            }        }    })}
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

问题是您将用户存储在一个上下文中,但随后您尝试从另一个上下文中检索用户。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")

        }

    }

}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信