我的应用程序在登录时将用户的文档从数据库加载到 redis session 中。然后它会针对 session 对象执行几乎所有请求验证。
问题
:在请求/响应周期之外修改正在进行的 session 以更新验证信息。
例如,如果用户订阅了博客帖子类别,他们可以阅读该类别中的帖子并为该类别做出贡献。但是,如果该类别的版主决定删除它,那么我不仅需要从磁盘上数据库中的用户文档中删除该类别,还需要从 Redis 中的用户 session 中删除该类别。
据我所知,我能做到这一点的唯一方法是在数据库中保存对用户文档中 session ID 的引用,然后在 Redis 中查找相应的 session 。
问题是我不确定 session 是否设计为在请求/响应周期之外进行修改,因为当我进行谷歌搜索时,我还没有真正看到任何相关主题的人想要这样做。
最佳答案
我不认为在 mongo 上存储有关 session 的信息是个好主意。如果用户同时从两个设备登录会怎样?我想在这种情况下您将有两个 session 对象(否则,应该有一种机制来猜测给定用户的 session ,这样您就不会遇到当前的问题)。
我的建议是将用户启动的一组 session 存储在 redis 中。当用户登录时,您将新的 session ID 添加到 SET 中,用户 ID 作为 key 的一部分。当用户注销时,您从 SET 中删除相应的条目。
当然,如果用户没有手动注销(如果您有这种行为), session 就会过期。为此,您可以在每次启动新 session 时将 SETEXP 设置为用户集。只要您的 SETEXP 时间比您的 session 到期时间稍长,您就可以确定只要您的 session 存在, session 就会存储在您的 SET 中。
新版本的 redis 将有一个 Observe 命令,可以更容易地删除从您的 set 对象中删除的 session 。您只需要观察 session 对象的创建/删除,您就可以根据它来管理您的 SET 插入/删除。在该命令正式发布之前,您将不得不坚持按时间过期。
关于node.js - 请求之外的 session 、验证和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278643/