是否有可能在Express中使特定用户的会话数据无效或删除?

好的,所以对于我的高级devise项目,我正在和一个Node.JS / Express应用程序的团队一起工作,参加SGA学生志愿者项目。 我们正在Express中使用MongoDB进行持久性会话存储。

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

  • 任何时候用户数据都被修改,它被写入MongoDB数据库。 如果数据库更新成功,用户会话将更新为数据库中的新文档。

  • 每次请求用户数据时,都会从会话存储中读取数据。

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

我们有不同types的用户。 我们有学生volunteer型用户,不同级别的staff型用户。 我不认为我们的会话/数据库组合会有问题,直到我的合作伙伴实现了顶级stafftypes用户的function。 他们有能力修改学生volunteer用户的数据。

在写入数据库时​​这不是问题,我们只是将修改的数据写入志愿者文档。 问题出在这样的事实,据我所知,我们没有办法根据stafftypes用户的请求来更新/无效/删除volunteer用户的会话来修改它。

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

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

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

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

编辑:不知道这是如何脱离主题,也许有点过于专注,可能没有“最小的理解”,我会尝试纠正,增加一些更多的澄清我的问题:

 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用户的数据时,这两者都是一样的,区别在于当志愿者更新他们的数据时,在callback中传回的更新的文件被用来更新会话(我使用下划线合并方法)

例:

 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); } }); }, 

由于我们的项目devise到目前为止,这是我的问题。 我不认为会议可以这样更新,但我不确定。 有没有办法保持会议更新? 还是我们只是用它全错了?

查看代码后 ,我写了下面的代码片段,希望它可以帮助

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