在快速会话中存在多个用户会话的问题

问题描述 投票:0回答:1

我遇到了几天的问题,但找不到解决方案,我搜索了论坛,文档什么也没有。我有一个用nodejs开发的网站,使用express-session和passport进行会话管理和用户身份验证。

我的问题是,如果两个不同的用户连接到我的网站并同时执行某个操作,则该网站已加载,但带有执行该操作的最后一个用户的会话。换句话说,它为同时执行该操作的其余用户使用一个会话。

这是我网站的基本配置

const express = require('express');
const morgan = require('morgan');
const path = require('path');
const exphbs = require('express-handlebars');
const session = require('express-session');
const validator = require('express-validator');
const passport = require('passport');
const flash = require('connect-flash');
const MySQLStore = require('express-mysql-session')(session);
const bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
const helmet = require("helmet");

const { database } = require('./keys');

// Intializations
const app = express();
require('./lib/passport');

// Settings
app.set('port', process.env.PORT || 4000);
app.set('views', path.join(__dirname, 'views'));
app.engine('.hbs', exphbs({
  defaultLayout: 'main',
  layoutsDir: path.join(app.get('views'), 'layouts'),
  partialsDir: path.join(app.get('views'), 'partials'),
  extname: '.hbs',
  helpers: require('./lib/handlebars')
}))
app.set('view engine', '.hbs');

// Middlewares
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(session({
  secret: '1234567789',
  key: "namecookie",
  resave: true,
  saveUninitialized: true,
  store: new MySQLStore(database),
  cookie: {
    secure: false,
    maxAge: 150000,
    httpOnly: false
  }
}));

app.use(function (req, res, next) {
  res.locals.session = req.session;
  next();
});

app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(validator());

// Global variables
app.use((req, res, next) => {
  app.locals.message = req.flash('message');
  app.locals.success = req.flash('success');
  app.locals.user = req.user;
  next();
});

// Routes
app.use(require('./routes/index'));
app.use(require('./routes/authentication'));
app.use('/links', require('./routes/links'));

// Public
app.use(express.static(path.join(__dirname, 'public')));
app.use(helmet());

// Starting
app.listen(app.get('port'), () => {
  console.log('Server is in port', app.get('port'));
});
javascript node.js express passport.js express-session
1个回答
0
投票

永远不要使用

app.locals
作为用户状态或每个请求状态。这对于您的服务器来说本质上是全局性的,并且会导致您混淆哪个用户是当前用户,因为一个用户的请求将覆盖另一个用户的数据,如果它们同时在飞行中,数据将会混淆。

仅使用

req
res
上的属性来跟踪当前请求的状态(例如您从会话中获得的用户)。

所以,这个:

app.locals.user = req.user;

是问题的主要根源。相反,直接使用来自

req.user
的数据,并且不要将用户状态或预请求状态分配给任何
app
属性。请记住,所有用户共享的只有一个
app
对象。

app.locals
是放置应用于服务器上所有请求的全局状态的位置。这不是您放置用户状态或预请求状态的位置。

© www.soinside.com 2019 - 2024. All rights reserved.