亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號