【问题标题】:Sails.js single instance of an authenticated userSails.js 单个经过身份验证的用户实例
【发布时间】:2014-10-01 17:55:57
【问题描述】:

我希望只允许一个用户实例登录。如果我在这台计算机上登录,然后去另一台计算机登录,之前的会话应该被破坏。我怎样才能做到这一点?如何访问所有会话,以便销毁正确的会话或确保会话的用户 ID 是唯一的?我看到的有关访问会话的唯一文档是 req.session,它仅适用于当前会话。

【问题讨论】:

    标签: node.js session express sails.js


    【解决方案1】:

    实现这一点的典型方法是将用户的会话 ID 保存在数据库中,并且每当他们登录时,销毁之前存储了 ID 的会话。 Sails 使用Connect's session store 进行会话管理。会话 ID 公开为req.sessionID,底层会话存储公开为req.sessionStore。因此,鉴于 Connect 文档中描述的会话存储接口,您可以在登录操作中执行以下操作:

    // Destroy the session from the previous login
    req.sessionStore.destroy(loggedInUser.currentSessionId, function(err) {
        if (err) {return res.serverError(err);}
        // Save the session ID of the current login
        User.update({id: loggedInUserId}, {currentSessionId: req.sessionID})
        .exec(function(err) {
            if (err) {return res.serverError(err);}
            // Continue your login action...
        });
    });
    

    【讨论】:

    • 从性能的角度来看,循环遍历所有会话并找到与尝试登录的用户的会话不是更快吗?当然,留在内存中(会话存储/reddis 中内置的帆)会比通过最有可能在持久存储上的数据库更快。
    • 转念一想,这可能是个坏主意。即使竞争条件不是问题,由于循环阻塞,有很多会话会在搜索时减慢其他人的速度,而数据库连接不会阻塞?
    • 很难说。这里唯一额外的 db 调用是User.update,从技术上讲,您甚至不必等待就可以继续。 sessionStore.destroy 非常快,因为它使用由会话 ID 索引的哈希。如果您不得不循环遍历所有会话,并且会话数量很多,则可能会降低性能(并且您必须等待它才能继续)。
    • 哈,没有看到你的第二条评论,但这基本上就是我要说的;)
    • 有什么理由使用User.update 而不是loggedInUser.currentSessionId = req.sessionID; loggedInUser.save();?据我所知,User.update 用于更新模型的多个实例,而 save 仅用于一个。
    猜你喜欢
    • 2020-11-15
    • 2016-01-17
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2019-12-11
    • 2017-09-11
    相关资源
    最近更新 更多