Gorilla会话-每个用户的会话

Gorilla会话-每个用户的会话,go,authentication,session,session-cookies,gorilla,Go,Authentication,Session,Session Cookies,Gorilla,使用gorilla会话时,我看到的每个示例都会执行以下操作: var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY"))) func MyHandler(w http.ResponseWriter, r *http.Request) { // Get a session. We're ignoring the error resulted from decoding

使用gorilla会话时,我看到的每个示例都会执行以下操作:

    var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

    func MyHandler(w http.ResponseWriter, r *http.Request) {
        // Get a session. We're ignoring the error resulted from decoding an
        // existing session: Get() always returns a session, even if empty.
        session, _ := store.Get(r, "session-name")
        // Set some session values.
        session.Values["foo"] = "bar"
        session.Values[42] = 43
        // Save it before we write to the response/return from the handler.
        err := session.Save(r, w)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    }
我在我的代码中也做到了这一点,而且很有效。我感到困惑的是
session,:=store.Get(r,“session name”)
。它是一个硬编码的值,将始终检索同一会话

为了验证这一点,我让2个匿名浏览器创建了一个会话,该会话的值映射中将用户ID作为一个值。两个浏览器都返回了创建会话的最后一个用户的值。这一切对我来说都很有意义,因为我们对所有事情都使用相同的会话名称

我的问题如下 要为每个经过身份验证的用户获取会话,我是否需要自己动态设置会话名称(可能需要来自经过身份验证的用户本身的一些信息)?如果是这样,当用户下次访问站点时,我需要再次从会话存储中检索信息时,我如何能够检索该信息


还是我完全用错误的方式思考课程?这是我第一次尝试用会话创建一些东西,因此我强烈感觉自己缺少一些基本概念。

cookie用于识别会话或存储会话数据,具体取决于所使用的会话存储。同一浏览器实例中的两个匿名窗口共享相同的cookie,因此将共享相同的会话。尝试以下操作之一:比较不同浏览器实例中的会话(有关如何启动单独实例的信息,请参阅浏览器命令行帮助)、比较匿名和非匿名之间的会话、比较Edge和Chrome之间的会话。

会话变量包含多个数据,包括会话开始时间。兴趣决定会话何时结束。 这意味着会话令牌即使在同一浏览器和某些窗口上也不同。因为同一用户不能同时登录多次。 但是,所有浏览器仍然知道这一点。因为它为同一用户携带相同的数据,例如唯一的名称或电子邮件

sess,session.Get(“session name”,c)用于会话类型。仅当您有多种类型的会话时才动态设置它

sess.Values[“email”]=email
用于查找与用户连接的用户?这些必须动态确定。它被设置为一个唯一的值,如电子邮件或Id。 可以存储一系列数据以定制用户体验。例如:名称、颜色、语言。他们建议不要储存密码。它加密敏感数据。赛前

这是一个简单的大猩猩会议:

func initSession(c echo.Context、名称、电子邮件字符串){
sess,u:=session.Get(“session name”,c)//session\u name,比如:addmin\u sess of user\u ses或onything。
sess.Options=&sessions.Options{
路径:“/”,
最大年龄:216000,/=1h,
HttpOnly:true,//没有websocket或任何其他协议
}
sess.Values[“email”]=电子邮件//在本系列中必不可少
sess.Save(c.Request(),c.Response())
}
func登录(c echo.Context)错误{
formEmail:=c.FormValue(“电子邮件”)
formPass:=c.FormValue(“密码”)
email,pass:=getUsername(formEmail)/“从UserTable中选择email pass,其中email\u字段==formEmail”
如果pass==formPass&&email==formEmail{
initSession(c,email)//在浏览器中设置此uniq用户的会话。
返回c.Redirect(http.StatusSeeOther,“/”///登录成功。
}
返回c.Render(200,“login.html”,“用户名或密码错误”)
}
未登录,用户无法访问:

func profilePage(c echo.Context)错误{
sess,u:=session.Get(“session_name”,c)
email:=sess.Values[“email”]//我们从浏览器获得电子邮件。
如果电子邮件==无{
返回c.Redirect(http.StatusSeeOther,“/login”)//首先登录。
}
返回c.Render(200,“profile.html”,email)//只显示email
}

天哪!谢谢你,我刚刚测试了这个,它成功了。呸!我应该做一个匿名窗口和一个常规窗口来验证它。谢谢分享。如果您愿意,复制并粘贴该评论作为答案,我将接受它。非常感谢。