7

有没有办法控制会话何时从 connect 的会话中间件开始?

例如,如果我有快速应用配置:

var app = express();
app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('secret'));
  app.use(express.session({ store:sessionStore, ... }));
});

然后在每个请求上,如果没有给出会话 cookie,就会启动一个会话。如果我只想在用户通过身份验证后开始会话怎么办?

例如,假设我有两条路线/protected/login.

  • 如果有人/protected在没有会话 cookie 的情况下点击,中间件将不会启动新会话。(req.sessionnull
  • 如果有人点击/protected了会话 cookie,中间件将检查是否存在与 cookie 和 set 匹配的活动会话req.session,但不会启动新会话。(req.session可以有一个值或者是null
  • 如果有人点击/login了正确的参数,则显式启动会话并仅设置 cookie。

启动会话的唯一方法应该是明确的:

app.post('/login', function(req, res, next) {
  // connect to database and validate user...
  db.authenticate( req.body.user, req.body.pass, function(allow) {
    if (allow) {
      // START SESSION HERE
      // this will send set the cookie
    }
  });
}

有没有办法用现有的连接会话中间件来完成这个?

4

2 回答 2

2

您要做的是删除此行:

app.use(express.session({ store:sessionStore, ... }))

现在默认情况下禁用会话,由您决定哪个控制器将使用它们:

var useSessions = express.session({ store:sessionStore, ... });

var preCb = function (req, res, next) {
  // authenticate and stuff
  // ....
  if (authenticated === true) {
     next();
  }
};

app.post('/login', useSessions, function(req, res, next) { ... });
app.post('/protected', preCb, useSessions, function(req, res, next) { ... });
于 2013-02-10T23:40:28.343 回答
0

即使每次都开始一个会话,也没有关系,因为它将是空的。如果您尝试使用它来验证访问权限(似乎是这种情况),最简单的解决方案是在您的会话中设置一个属性(例如 req.session.authenticated = true;),然后检查它。这种方式从技术上讲,任何访问者都有一个会话,但是如果 req.session.authenticated == true,您将只使用该会话。它可能不是您正在寻找的东西,但它是完成此任务的最简单方法。

于 2013-01-18T01:15:17.103 回答