NodeJS 控制会话从express和connect中间件开始

8fq7wneg  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(130)

有没有办法用connect的会话中间件来控制会话何时开始?
例如,如果我有express app config:

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, ... }));
});

然后在 every 请求时,如果没有给出会话cookie,则启动会话。如果我只想在用户通过身份验证后才启动会话,该怎么办?
例如,假设我有两条路由/protected/login

  • 如果有人在没有会话cookie的情况下点击/protected,中间件将启动新的会话。(req.sessionnull
  • 如果有人使用会话cookie命中/protected,中间件将检查以查看是否存在与cookie匹配的活动会话并设置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
    }
  });
}

有没有什么方法可以用现有的连接会话中间件来实现这一点?

1qczuiv0

1qczuiv01#

你要做的是删除这一行:

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) { ... });
7cjasjjr

7cjasjjr2#

即使每次都启动一个会话,也没有什么关系,因为它将是空的。如果您试图使用它来验证访问(看起来确实如此),最简单的解决方案是在会话中设置一个属性(例如req.session.authenticated = true;),并检查一下。这种方式技术上的任何访问者都有一个会话,但是你只会利用会话,如果req.session.authenticated == true.这可能不是你想要的,但这是最简单的方法。

相关问题