【问题标题】:Storing a user ID with the session id使用会话 ID 存储用户 ID
【发布时间】:2021-02-23 21:59:27
【问题描述】:

我将会话保存在 redis 数据库中(不是内存,实际上是数据库)。

我想在会话中存储一些内容,以便能够跟踪用户会话并能够限制每个用户可以拥有的会话数量。

我已经注册,登录和退出工作。

签名时,它会检查他们是否有有效的会话,如果没有,它将验证用户,然后创建一个会话并向会话添加值。 当他们退出时,它将删除会话。

当我检查 Redis 数据库时,我看到:

KEYS '*'

"session_QPEOONJ25OG4HGWCN4Y556VGUN26V7IIASOYLGBVPZSPKO2B3P7FENYYDLPRWV2IBJK4RNANLCYANGMN7UUDG6DJ4NZG7XZBSFW3LWI"

这是我的登录功能。

func signIn(c echo.Context) error {

    ctx := c.Request().Context()
    collection := mg.Db.Collection("users")

    // validation code removed for convenience 

    err = bcrypt.CompareHashAndPassword([]byte(existingUser.HashedPassword), []byte(signInUser.Password))
    if err != nil {
        return c.String(http.StatusNotAcceptable, "Incorrect password")
    }

    store := redisSessionInstance.Store

    session, err := store.Get(c.Request(), "session_")
    if err != nil {
        fmt.Println("failed getting session: ", err)
    }

    // checks if session exists or is new one
    if session.IsNew {
        session.Values["id"] = existingUser.ID.String() // ID of user from mongodb
        session.Values["role"] = existingUser.Role

        // Save session
        if err = session.Save(c.Request(), c.Response()); err != nil {
            fmt.Println("failed saving session: ", err)
        }
    }

    return c.String(http.StatusAccepted, "Signed In!")
}

如您所见,我获得了用户 ID 和角色等信息。

我希望能够限制每个用户可以随时打开的会话数量。 我还希望能够知道 Redis Db 中每个用户的会话,并能够删除每个用户的会话。 (基本上是某种将每个用户与他们的会话联系起来的方法)

我该怎么做?

【问题讨论】:

    标签: go redis redis-cluster


    【解决方案1】:

    您可以使用列表来存储用户的会话。你可以通过提前LLEN <key>检查长度来限制会话的数量。

    您可以使用LRANGE <key> 0 -1查询列表中的所有会话

    【讨论】:

    • 您好,感谢您的输入,我将如何存储列表以及它如何与我当前的解决方案一起使用?谢谢
    • 我目前已对其进行了更改,以便会话将 userSessionID 存储到令牌中。这意味着对于分配给特定用户的所有会话,它们具有 userSessionID 的值。如何使用会话包通过 redis 商店存储它:github.com/rbcervilla/redisstore/v8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多