Session Express.js+;Passport.js:如何限制同一用户多次登录?

Session Express.js+;Passport.js:如何限制同一用户多次登录?,session,express,passport.js,Session,Express,Passport.js,默认情况下,Passport允许同一用户从多个浏览器登录,并创建唯一的会话。当用户尝试创建第二个会话时,如何将其配置为销毁第一个会话 目前,我正在使用“会话”模型将用户名添加到记录中,并在后续登录时通过用户名检查会话是否存在。但这会增加到db的流量。我认为express必须已经这样做了,或者已经做了,将“登录用户”信息保存在内存中,以便简化流程。我非常感谢您提出的关于如何使用express实现此目的的调整的想法或任何其他解决方法/建议。 非常感谢 我认为express必须已经这样做了,或者已经做

默认情况下,Passport允许同一用户从多个浏览器登录,并创建唯一的会话。当用户尝试创建第二个会话时,如何将其配置为销毁第一个会话

目前,我正在使用“会话”模型将用户名添加到记录中,并在后续登录时通过用户名检查会话是否存在。但这会增加到db的流量。我认为express必须已经这样做了,或者已经做了,将“登录用户”信息保存在内存中,以便简化流程。我非常感谢您提出的关于如何使用express实现此目的的调整的想法或任何其他解决方法/建议。 非常感谢

我认为express必须已经这样做了,或者已经做了,将“登录用户”信息保存在内存中,以便简化流程

我相信
会话
模型会记录用户的登录,并且只将登录的内容保存在会话cookie中。服务器本身不知道是谁登录的,只是在浏览器提供的(已签名的)会话cookie中检查此状态


您可以编写自己的Passport.js策略来进行不同的处理。

我看到至少有4个用户对这个问题投了赞成票,所以我决定为此创建
Passport策略。新的策略称为
passport,每个用户一个会话
。这是一种开源策略,您可以在此处访问:

如何使用它?在
会话之后立即添加它。例如:

app.use(passport.session())
var passportOneSessionPerUser=require('passport-one-session-per-user')
passport.use(new passportOneSessionPerUser())
app.use(passport.authenticate('passport-one-session-per-user'))
不需要设置或配置

它是如何工作的?

该策略创建了一个包含序列化用户对象和sessionID的数组


每次用户登录时,策略都会检查用户是否已登录。如果是这样,则标记另一个会话。下次其他会话中的用户发出请求时,该策略会看到该标志,并将用户注销。

i如果您决定使用某种群集/多个进程,那么将登录的用户信息保留在内存中不是一个好主意,因为这种方法将失败。我想到的一个“简单”解决方案是将数据存储在redis/memcached上。它仍然需要您进行某种形式的“查询”,但我怀疑这会降低性能(明显)。关于我的答案。这对你有帮助吗?这能解决问题吗?我已经找到了这个答案(但我在这里发布了我自己关于同一主题的问题),是否可以在我当前的设置中使用您的模块?Thankso是什么阻止某人使用相同密码从另一台计算机或浏览器登录?