首先,我没有找到任何类似的问题或有用的材料。如果我错过了什么,我很抱歉!
其次,我对node-passport或connect-auth或everyauth等现成的解决方案不感兴趣
现在的问题。我正在使用 Redis 来存储快速会话。我的问题是,当用户进行身份验证时(即在发布用户名和密码并且在集合中找到此类用户之后)我应该在会话中存储什么?
我可以存储整个用户对象(例如,它来自 MongoDB 的方式)。我看到的一个缺点是,当用户在数据库中被修改时(他编辑了他的个人资料),我必须在会话中“重新设置”用户对象。如果例如管理员更改了用户的配置文件,它会变得更加复杂 - 在这种情况下,会话不知道用户已被修改并且需要从数据库刷新其数据,因此会话当前持有过时的用户对象,这将仅在用户下次登录时更新。
创建一个“hash => userid”集合并在会话中仅存储哈希。然后每个请求,调用一个将检查的中间件(下面的伪代码,省略了对不存在哈希的检查,在这种情况下,用户可能会被认为是会话过期后未登录):
if(req.session 中的用户哈希) res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));
那么这种方法的明显缺点是额外的集合(即mongodb)或key => value(即redis)存储hash => userid,这还需要一些程序来清理旧的会话散列(计划任务\cron,它将运行和删除旧的过期哈希)。
另一个类似于 #2 的解决方案,不是使用 3-d 方集合/key=>value 存储,而是将哈希作为部分用户对象存储在 MongoDB 中。然而,此方法消除了额外的集合/redis 键值,但仍需要计划任务来清理旧的过期会话。并且由于过期会话可能由“过期日期”属性定义,因此更容易维护活动会话的 3-d 方集合,而不是将会话相关数据放入 MongoDB 中的用户对象中(从而使用户对象变得巨大)。
我是 Node-js 的新手,这就是我问的原因。我也明白可能没有正确答案,或者可能受限于个人喜好。
谢谢!