【问题标题】:ExpressJS: How to conditionally start session?ExpressJS:如何有条件地开始会话?
【发布时间】:2019-05-23 13:05:36
【问题描述】:

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

我正在使用带有 NodeJS 的 Express 4,并尝试使用 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;
  }

  /* ... */

});

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

谁能指出正确的方向?

【问题讨论】:

    标签: node.js express session express-session


    【解决方案1】:

    这并没有回答您的主要问题,但解决了您(看似)主要的问题:

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

    您可以附加一个变量到req.session 对象以检查用户是否已登录。

    login 路由中设置loggedIn 的状态

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

    【讨论】:

    • 但这意味着即使用户未登录也会启动会话,对吗?这会是内存问题吗?。
    • @YongQuan 是的,如果您使用默认的MemoryStore。并且在文档MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions 中明确提到了最好将会话存储在db 中,这样您的会话就不会在服务器重启时被清除
    猜你喜欢
    • 2012-02-14
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多