节点js – 用户身份validation,在会话中存储什么?

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

其次,我对像node-passport或connect-auth或everyauth这样的现成解决scheme不感兴趣

现在的问题。 我正在使用Redis来存储快速会话。 我的问题是,当用户进行身份validation(即在用户名和密码发布后,这个用户被发现在集合中)我应该在会话中存储什么?

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

  2. 创build一个“hash => userid”的集合,并在会话中只存储散列。 然后每一个请求,调用一个中间件,将检查(下面的伪代码,省略检查不存在的哈希,在这种情况下,用户可能会被视为没有login,因为会话过期):

    如果(在req.session中的userhash)res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));

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

  3. 另一个类似于#2的解决scheme,而不是使用三维方collection / key =>值存储,将散列存储为MongoDB中的User对象的一部分。 然而,此方法消除了额外的收集/ redis键值,但仍然需要计划的任务来清除旧的过期会话。 由于过期的会话可能会由“过期date”属性定义,因此它更容易维护活动会话的三方聚合,而不是将会话相关数据放入MongoDB中的User对象(从而使User对象变大)。

我是Node-j的新手,这就是为什么我要问。 我也明白,可能没有正确的答案,或者可能会受到个人喜好的限制。

谢谢!

与传统框架(比如PHP / ASP /其他)相比,Node / Express中的会话确实没什么特别之处。 你会用PHP在用户login时做什么?

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

会话数据是安全的(因为客户端不能像使用cookie一样摆弄它),所以您可以依靠会话的用户ID来指向已经正确validation的用户数据。