golang:自定义会话库以向redis存储添加更多值

eh57zj3b  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(207)

我已经学了三个星期了,如果你有时间的话,我可以帮你!
我正在使用以下库来管理会话(我让它工作):
https://github.com/rbcervilla/redisstore
这是一个相当小的库,主文件只是:
https://github.com/rbcervilla/redisstore/blob/master/redisstore.go
基本上,它创建一个会话并将其存储在redis存储中,然后根据存储进行验证等等。
我有所有这些工作在我的api。
我的问题是:
因此,我当前正在为会话设置一个usersessionid值,该值通过对用户的响应传回。这是用户独有的,将用于获取用户的用户id(以获取特定于用户的数据)
目前在库实现中,它将会话存储在redis中,如:

"session_UDPTLRXUXTJZMVB2AFWRNJHJQXBR27ZY5KZ7Z3KSIXL6ETQ4KXEIBJA4WEVEQID2WSAFQFKLFOHWYT42PIHUMRNW5RWSS76Z72QS4SI"

不过,我希望能够添加更多的信息,比如:[usersessionid,userid,role,sessionid]。
库中提到客户端没有加密,因为它们只有一个sessionid,后端处理如何处理sessionid,所以我不认为我可以直接将所有这些数据存储到会话cookie中。
我的理由是为什么我需要将这些存储在redis存储中:(除了更快的速度,而不是每次请求都查询mongodb)
usersessionid作为会话令牌中的值发送给用户。它的使用使得我们不必发送userid,从而将其隐藏起来。
通过计算存储中usersessionid对象的数量,我们可以确定每个用户有多少个会话,并且可以让用户关闭所有其他会话,或者关闭包括此会话在内的所有会话。我们还可以对每个用户或每个角色允许的会话数量设置限制。
userid是mongo db中用户的唯一id,可以在用户发送会话令牌时确定,会话令牌将usersessionid设置为一个值
存储角色以确定每个会话的用户角色,中间件可以为每个请求查询该角色。
sessionid是每个现有会话的唯一会话id。会话具有唯一的sessionid,但可以与其他会话具有相同的usersessionid

Session Concept:
[userSessionID, userID, role, sessionID]
———————————
[534, 40, “user”, 689]
[534, 40, “user”, 690]
[534, 40, “user”, 691]
[534, 40, “user”, 692]

这将非常有用,因为会话令牌将只在其值中存储usersessionid,然后当用户尝试获取另一个会话时,后端可以检查redis存储,查看提供的usersessionid存在多少个sessionid,并确定是否已经存在过多的sessionid。
它还允许用户关闭除此会话之外的所有其他会话。或者关闭所有会话,包括这个会话。
通过将角色存储在redis存储中,您不必将其存储在会话中,因此在后端,您可以使用casbin中间件来找出每个会话的角色。如果一个用户被提升并且打开了多个会话,您可以决定提升所有会话角色,或者只提升当前和新的会话角色。
这是我当前的登录:

store := redisSessionInstance.Store

session, err := store.Get(c.Request(), "session_")
if err != nil {
    return c.String(http.StatusNotAcceptable, "failed getting session")
}

// checks if session exists or is new one
// only need to set data to its values if it's new

if session.IsNew {
    // TODO check here if too many sessions exist
    var userSessionID, err = primitive.ObjectIDFromHex(existingUser.UserSessionID.Hex())
    if err != nil {
        fmt.Println("Error getting user session ID")
        return c.String(http.StatusNotAcceptable, "error getting user session id")
    }
    // This is used when calling endpoints to get specific user data
    session.Values["userSessionID"] = userSessionID.Hex()

    session.IsNew = false

    // TODO somehow save the userSessionID to redis along with sessionID so that we can determine which user owns which sessions.
    // Save session
    if err = session.Save(c.Request(), c.Response()); err != nil {
        fmt.Println("failed saving session: ", err)
        return c.String(http.StatusNotAcceptable, "failed saving session")
    }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题