【问题标题】:Ended sessions are not being destroyed结束的会话没有被销毁
【发布时间】:2016-12-24 19:18:25
【问题描述】:

我的应用程序使用connect-mongoexpress-sessionkeystonepassport 处理登录和用户会话。

但是,当会话结束(用户注销或关闭浏览器窗口)时,会话不会从 MongoDB 会话存储中删除。

这是我的中间件设置:

var express = require('express')
    , path = require('path')
    , cookieParser = require('cookie-parser')
    , bodyParser = require('body-parser')
    , passport = require('passport')
    , session = require('express-session')
    , mongoStore = require('connect-mongo')(session)
    , compression = require('compression')
    , favicon = require('serve-favicon')
    , config = require('../config')
    , flash = require('connect-flash');

app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', parameterLimit: 52428800, extended: true}));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(compression());
app.use(express.static(path.join(__dirname, '../', config.get('staticContentPath')), {
    maxAge: (60 * 60 * 24 * 7) * 1000 
}));

app.use(session({
    secret: process.env.COOKIE_SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge: 24 * 60 * 60 * 1000 // 24 hrs
    },
    store: new mongoStore({
        url: config.get('mongo')
    })
}));

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

MongoDB 中会话的集合名称是 app_sessions。在我的依赖关系树中搜索表明这是由 Keystone CMS 处理的。

cookie 名称也是 keystone.sid

这是我的 Keystone 配置:

var config = require('../../lib/config')
    , keystone = require('keystone');

module.exports = function(app){

    keystone.init({
        'app': app,
        'port': config.get('keystone').port,
        'brand': config.get('sitename'),
        'views': app.get('views'),
        'view engine': app.get('view engine'),
        'custom engine': app.get('custom engine'),
        'auto update': false,
        'session': true,
        'session store': 'mongo',
        'auth': true,
        'user model': 'Account',
        'cookie secret': process.env.COOKIE_SECRET,
        'compress': true,
        'frame_guard': 'deny',
        'mongo': config.get('mongo')
    });

    keystone.import('../../lib/models');
    keystone.start();
};

最后是来自 MongoDB 的一些示例会话对象:

{ 
    "_id" : "GUL2jwhCvqZHO7Gqy8KCHod1qJmrl6j4", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:01:53.475Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:01:57.642+0000")
},
{ 
    "_id" : "C-4cuoyIGHgYM8hLGhQVOv3bRwChwkxq", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:02:44.000Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:02:51.473+0000")
},
{ 
    "_id" : "foE9ewU3eoJXIzkW97GSbMGNzFt2W4ww", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:04:35.294Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:04:38.979+0000")
},
{ 
    "_id" : "P8ugG4TFHJAuCzNS9aCMSybIS25uFtL1", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"userId\":\"56cadedbc580346a1bd0ee0c\",\"_garbage\":\"2016-08-17T23:57:03.615Z\",\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T23:57:05.203+0000")
}

你能看出为什么会话不会被销毁吗?

【问题讨论】:

    标签: node.js mongodb express keystonejs connect-mongo


    【解决方案1】:

    为什么关闭浏览器后用户仍然登录?

    显然是因为它是一个很好的功能。即使在浏览器关闭后也能保持会话。但是无论如何如果您想在关闭浏览器时使会话过期,那么您可以将 maxAge 设置为 -1

    为什么即使在注销后也不会删除会话数据?

    我认为这可能是 keystone.JS 的开发者所选择的。我只是在查看 keystone/lib/session.js 中的 signout 函数。

    这里是调用 req.session.regenerate

    它可能应该改为调用 req.session.destroy。我只是尝试进行更改和测试。但我仍然可以在数据库中看到会话。然后我想。解决方案是clear_interval

    【讨论】:

    • 也许我不完全理解会话应该如何工作。我的印象是会话结束时应该删除存储的会话,但您是说按照设计,它们保存在会话存储中,以便可以重复使用?
    • 不,我没有那个。?你试过 clear_interval 建议吗?我累了,但没有成功。
    • 我没有说,你说,我不懂会话。我说过:-) 我刚刚开始认为我应该将会话保持原样并将它们保留在会话存储中。这可能是它应该如何工作。
    • 哈哈哈,没错,您将面临的唯一问题是 servre 关闭时。用户将被强制登录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2016-08-09
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2011-11-25
    相关资源
    最近更新 更多