存储具有会话ID的用户ID

问题描述

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

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

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

在签名时,它会检查他们是否具有有效的会话,否则将对用户进行身份验证,然后创建一个会话并向该会话中添加值。 他们退出后,它将删除会话。

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

键“ *”

"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中每个用户的会话,并能够删除每个用户的会话。 (基本上是一种将每个用户绑定到其会话的方法

我将如何处理?

解决方法

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

您可以使用LRANGE <key> 0 -1

查询列表中的所有会话