【问题标题】:Cannot get gorilla session.Value by key无法获取大猩猩会话。按键值
【发布时间】:2018-09-11 21:30:15
【问题描述】:

问题是,无法从同一包中另一个文件中的 session.Value 获取值

在 controllers.go 文件中

func (c *AuthenticationControllers) AdminLogin() http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")

          //AUTHENTICATION

        if answer {
            w.Write([]byte("Successful Authenticated!"))

            //1* Create Session

            session, _ := store.Get(r, "session") //SESSION START

            ///Here I've setted true
            session.Values["authenticated"] = true//Successful Authenticated

            sessionToken, _ := uuid.NewV4() //Generate session token

            session.Values["userid"] = sessionToken.String()

            session.Save(r, w)


            //Redirect
            http.Redirect(w, r, "/admin/application", 302)
        } else {
            //http.Redirect(w, r, "/login", 302)

            http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
        }

    }
}

IN middleware.go 文件在同一个包中

 func (m *AuthenticationMiddleWares) RequiresLogin(handler http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        session, _ := store.Get(r, "session") //!!!

        if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
            http.Error(w, "Forbidden", http.StatusForbidden)
            return
        }

        handler(w, r)
    }
}


 session.Values["authenticated"] //has nil value, but has to be true after authentification in order to get you access to the route
router.HandleFunc("/admin/applications", authMiddle.RequiresLogin(authContrl.Application()))

我做错了什么?为什么 session.Values["authenticated"] 返回 "nil"

【问题讨论】:

    标签: session go gorilla


    【解决方案1】:

    session, _ := store.Get(r, "session") //SESSION START,你的会话依赖于请求r,这是一个由调用你的控制器的包创建的指针。如果您从另一个文件调用session,您需要确保它与传递给store.Get() 的请求相同。这可能是原因。

    【讨论】:

    • 我如何从控制器处理程序获取请求
    • 如果不实际调用控制器,这很困难。所以需要这个会话的函数可以在控制器或中间件中调用。您可以通过多种方式执行此操作,但为此您需要告诉我这个新文件在哪里以及您希望它做什么。
    • 我的身份验证 api 的结构如下: -----Authentication API -services.go -controllers.go -middleware.go ------- 在 /login 之后,我设置了["authenticated"] = true,以检查用户是否通过身份验证以让他访问路由:/admin/application
    • 您是否检查过客户端是否在所有后续请求中根据您从login 获得的响应设置cookie?
    • 我在中间件中检查了 session, _ := store.Get(r, "session"),所以它返回空映射,这意味着它没有看到存储的值但是我已经保存了在登录中使用 Save() 方法。这让我很困惑
    猜你喜欢
    • 2015-03-30
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2018-06-08
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多