在Express.js中使用会话

我需要帮助理解Web应用程序的会话的概念。 我使用Express 3.0运行Node.js服务器。

我的目标是:

  • 为每个login的用户创build一个会话

  • 存储此会话并用它来validation用户是否已经login(防止两个设备同时使用同一用户),并限制对某些页面的访问(通过将会话ID与其他一些数据进行匹配)

我将使用MemoryStore保存会话(似乎最简单)。 如果上述目标有意义,您可以提供一个彻底的解释如何实现它们?

Express在github回购中有很好的例子 。 其中之一处理身份validation,并显示如何将用户附加到req.session对象。 这是在app.post('/login')path中完成的。

为了限制对某些页面的访问,向这些路由添加一个简单的中间件

 function restrict(req, res, next) { if (req.session.user) { next(); } else { req.session.error = 'Access denied!'; res.redirect('/login'); } } app.get('/restricted', restrict, function(req, res){ res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>'); }); 

正如Brandon已经提到的,你不应该在生产中使用MemoryStore。 Redis是一个很好的select。 使用connect-redis访问数据库。 一个示例configuration看起来像这样

 var RedisStore = require('connect-redis')(express); // add this to your app.configure app.use(express.session({ secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig", store: new RedisStore({ host: 'localhost', port: 3000, client: redis }) })); 

如果您没有创build多个实例(例如使用集群模块),则仅在Express中使用MemoryStore。 如果您要跨计算机进行负载平衡,则您的负载平衡器将需要使用粘滞/持久会话。

如果你满足这些要求,那么你所要做的就是在login时,一旦证书被validation,设置一个会话variables来指示login,例如:

 req.session.loggedIn = true; 

如果你想检查用户是否login,只需检查该variables。

 if (req.session.loggedIn) { // user is logged in. } else { // user is not logged in. } 

您提到防止单个用户一次有超过一个会话的会话。 为了达到这个目的,你可能需要在数据库中存储一些表明用户已经login的东西。我警告你,由于陈旧的会话,这可能是危险的。 例如,如果用户login,但从不登出? 如果他们closures了浏览器窗口,会话永远消失了呢?

Express没有空闲会话到期的概念。 我通过将所有会话与上次访问的时间戳一起存储在数据库中,然后定期根据时间清理会话数据,从而实现了这样的function。 但是,那么你需要更新你的login名单。