7

首先,我没有找到任何类似的问题或有用的材料。如果我错过了什么,我很抱歉!

其次,我对node-passportconnect-autheveryauth等现成的解决方案不感兴趣

现在的问题。我正在使用 Redis 来存储快速会话。我的问题是,当用户进行身份验证时(即在发布用户名和密码并且在集合中找到此类用户之后)我应该在会话中存储什么?

  1. 我可以存储整个用户对象(例如,它来自 MongoDB 的方式)。我看到的一个缺点是,当用户在数据库中被修改时(他编辑了他的个人资料),我必须在会话中“重新设置”用户对象。如果例如管理员更改了用户的配置文件,它会变得更加复杂 - 在这种情况下,会话不知道用户已被修改并且需要从数据库刷新其数据,因此会话当前持有过时的用户对象,这将仅在用户下次登录时更新。

  2. 创建一个“hash => userid”集合并在会话中仅存储哈希。然后每个请求,调用一个将检查的中间件(下面的伪代码,省略了对不存在哈希的检查,在这种情况下,用户可能会被认为是会话过期后未登录):

    if(req.session 中的用户哈希) res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));

    那么这种方法的明显缺点是额外的集合(即mongodb)或key => value(即redis)存储hash => userid,这还需要一些程序来清理旧的会话散列(计划任务\cron,它将运行和删除旧的过期哈希)。

  3. 另一个类似于 #2 的解决方案,不是使用 3-d 方集合/key=>value 存储,而是将哈希作为部分用户对象存储在 MongoDB 中。然而,此方法消除了额外的集合/redis 键值,但仍需要计划任务来清理旧的过期会话。并且由于过期会话可能由“过期日期”属性定义,因此更容易维护活动会话的 3-d 方集合,而不是将会话相关数据放入 MongoDB 中的用户对象中(从而使用户对象变得巨大)。

我是 Node-js 的新手,这就是我问的原因。我也明白可能没有正确答案,或者可能受限于个人喜好。

谢谢!

4

1 回答 1

4

与传统框架(如 PHP/ASP/whatever)相比,Node/Express 中的会话确实没有什么特别之处。你会如何处理 PHP 中的用户登录?

只需将用户 ID 存储在会话中。需要时从 Mongo 中提取用户数据。

会话数据是安全的(因为客户端不能像使用 cookie 那样摆弄它),因此您可以依赖会话的用户 ID 指向已正确验证的用户数据。

于 2013-02-04T17:04:09.863 回答