使用Express.js中的Sessions

ces*_*z91 36 session node.js express

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

我的目标是:

  • 为每个登录的用户创建会话

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

我将使用MemoryStore来保存会话(看起来最简单).如果上述目标有意义,您能否提供如何实现这些目标的详尽说明?

zem*_*rco 41

Express 在github repo中有很好的例子.其中一个处理身份验证并显示如何将用户附加到req.session对象.这是在app.post('/login')路线内完成的.

要限制对某些页面的访问,请为这些路径添加一个简单的中间件

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>');
});
Run Code Online (Sandbox Code Playgroud)

正如Brandon已经提到的那样,你不应该在生产中使用MemoryStore.Redis是一个不错的选择.使用connect-redis访问数据库.配置示例如下所示

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 })
}));
Run Code Online (Sandbox Code Playgroud)


Bra*_*don 10

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

如果您满足这些要求,那么您需要做的就是登录时,一旦验证了凭据,设置会话变量以指示登录,例如:

req.session.loggedIn = true;
Run Code Online (Sandbox Code Playgroud)

如果要检查用户是否已登录,只需检查该变量即可.

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}
Run Code Online (Sandbox Code Playgroud)

您提到阻止单个用户一次会话多个会话.为此,您可能需要在数据库中存储指示用户已登录的内容.我警告您,由于过时会话,这可能很危险.例如,如果用户登录但从未注销,该怎么办?如果他们关闭浏览器窗口以便会话永远消失怎么办?

Express没有空闲会话到期的概念.我已经通过在数据库中存储所有会话以及最后访问的时间戳来实现这样的事情,然后根据时间定期清理会话数据.但是,您还需要更新登录的人员列表.