ExpressJS:如何有条件地启动会话?

时间:2019-05-23 04:11:50

标签: node.js express session express-session

这听起来像是一个非常简单/愚蠢的问题,但我在网上找不到任何有关它的信息。

我正在将Express 4与NodeJS一起使用,并尝试使用express-session middleware来实现会话。我想使用会话来允许/禁止针对不同用户的某些路由。

我知道我可以在条件路由上使用会话

const express = require('express');
const Router = require('express').Router;
const router = new Router();

const session = require('express-session');
const sessioning = session({...});

router.post('/login', sessioning, (req, res) => {

});

但这不是我想要做的。即使失败的登录尝试,这也将启动会话。

我要执行的操作是仅在成功登录后才开始会话:

const express = require('express');
const Router = require('express').Router;
const router = new Router();

const session = require('express-session');


router.post('/login', (req, res) => {

  /* ... Login validations */

  if (login === 'success'){

    /* ... start session */

  }

  res.json({...});

});

这样我就可以禁止未经身份验证的用户访问受保护的路由:

router.get('/protected', (req, res) => {

  if (!req.session){
    res.status(401);
    res.end();
    return;
  }

  /* ... */

});

如果我直接在受保护的路由上设置会话,那么它将无法验证用户是否已登录。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

这不能回答您的主要问题,但可以解决您(貌似)的主要问题

  

如果我直接在受保护的路由上设置会话,那么它将无法验证用户是否已登录。

您可以将变量附加req.session对象中,以检查用户是否登录。

loggedIn路线中将login设置为状态

router.post('/login', (req, res) => {
  /* ... Login validations */
  if (login === 'success'){

    req.session.loggedIn = true;
  }
  // ...
});

并设置一个中间件来检查用户是否已登录并保护您的路由。

function checkLoggedIn(req, res, next) {
  if (req.session.loggedIn)
    next();
  else
    res.redirect('/login')
}

// Your protected route
router.get('/protected', checkLoggedIn, (req, res) => {
  // ...
});