【问题标题】:Is it possible to invalidate or delete a particular user's session data in Express?是否可以在 Express 中使特定用户的会话数据无效或删除?
【发布时间】:2013-11-19 22:51:54
【问题描述】:

好的,对于我的高级设计项目,我正在与一个小组合作开发一个 Node.JS / Express 应用程序,用于 SGA 学生志愿者计划。我们使用 MongoDB 和 Express 中的会话存储来实现持久性。

  • 当用户登录时,他们的文档被复制到他们的会话存储中。

  • 任何时候修改用户数据,都会将其写入 MongoDB 数据库。如果数据库更新成功,则用户会话将使用数据库中由更新产生的新文档进行更新。

  • 任何时候请求用户数据,都会从会话存储中读取。

只要每次在数据库中成功修改用户数据时会话保持更新,这就会起作用。它还让我们避免每次使用一些用户数据渲染视图时都必须从数据库中读取数据。

我们有不同类型的用户。我们有学生volunteer类型的用户,不同级别的staff类型的用户。在我的合作伙伴为顶级staff 类型用户实现功能之前,我认为会话/数据库组合不会出现问题。他们有能力修改学生volunteer用户的数据。

写入数据库时​​这不是问题,我们只是将修改后的数据写入志愿者文档。问题在于,据我所知,我们无法更新/无效/删除volunteer 用户的会话以响应staff 类型用户的修改请求。

基本上,如果staff 用户修改了volunteer 用户的数据并且volunteer 用户没有 签名,那么一切正常,修改将被进行并且volunteer 文档在数据库中将被修改。当志愿者登录时,这个修改后的数据将从数据库中读取并存储在用户的会话中。

但是,如果staff 用户修改了volunteer 用户的数据并且volunteer 用户 已登录,则可能会出现问题。数据库中的volunteer 文档将被更新,但volunteer 用户的会话将不会更新,直到会话结束并且用户再次登录导致他们的文档从数据库被读入他们的新会话,或者直到volunteer 用户修改了他们的数据,导致他们的会话被数据库中的新数据更新(这种可能性可能会也可能不会覆盖staff 用户所做的更改)。

不用说,如果不加以解决,这可能会导致不一致。有没有人对我如何处理这个问题有任何建议。如果我们要允许一个用户更新另一个用户的数据,是否不能按计划使用会话存储?

是否可以响应不同的特定用户的请求而使特定用户的会话无效/删除?或者可以修改特定用户的会话以响应不同的特定用户的请求?

编辑: 不知道这是怎么跑题的,也许有点过于专注并且可能没有“最少的理解”,我将尝试通过添加更多内容来澄清我的问题来纠正这一点:

function updateUserDocument(req, res, id, callback) {
    var data = req.body;
    var query = { _id: id };
    var cmd = {
        $set: {
            role: 'volunteer',
            volunteer: data
        }
    };
    var opt = { w: 1, new: true };
    users.findAndModify(query, null, cmd, opt, function (err, updated) {
        if (err || !updated) {
            callback(err);
        } else {
            callback(null, updated);
        }
    });
}

volunteer 更新他们自己的数据时,以及staff 用户更新volunteer 用户的数据时都使用这个,区别在于当志愿者更新他们的数据时,更新的文档在回调中传回用于更新会话(我使用下划线合并方法)

例子:

module.exports = {
    volunteerUpdateVolunteer: function (req, res) {
        updateUserData(req, res, req.session.user._id, function (err, doc) {
            if (err) {
                res.send(400);
            } else {
                // save user session with updated document send success response
                _.merge(req.session.user, doc);
                res.send(200);
            }
        });
    },

    staffUpdateVolunteer: function (req, res) {
        updateUserData(req, res, req.params.id, function (err, doc) {
            if (err) {
                res.send(400);
            } else {
                // no way to update the volunteer user's session here?
                // how can I handle possible inconsistencies?
                res.send(200);
            }
        });
    },

由于我们的项目是到目前为止设计的,这是我的问题。我不认为会话可以以这种方式保持更新,但我不确定。有没有办法让会话保持更新?还是我们只是用错了?

【问题讨论】:

  • 如果它在打开后立即关闭,因为我对我要解决的问题没有“最低限度的理解”;那么很高兴能得到启发,并让我显然对这个问题有明显的概念性误解的人可以纠正这个问题,而这个人显然确实需要最少的理解。老实说,我非常感谢任何建议。

标签: node.js mongodb session express database


【解决方案1】:

查看code后,我在sn-p下面写了,希望对你有帮助

    var express = require('express');

    var sesseionStore = new express.session.MemoryStore();

    app.use(express.session({
        secret: 'a4f8071f-c873-4447-8ee2',
        cookie: { maxAge: 2628000000 },
        store: sesseionStore
    }));


    var volunteerid2sessionid = {

    };

    express.use(function (req, res, next) {
        volunteerid2sessionid[req.session.user._id] = req.sessionID;
        next();

    });


    /// working with volunteer sesseion
    // seems volunteerid is req.params.id in staffUpdateVolunteer
    sessionid = volunteerid2sessionid[volunteerid]; 
    sesseionStore.get(sessionid, function(err, sess){

    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2012-01-18
    相关资源
    最近更新 更多