【问题标题】:Why do I need to deserialize user at each request with PassportJS?为什么我需要在每次使用 PassportJS 的请求时反序列化用户?
【发布时间】:2016-10-16 16:05:59
【问题描述】:

我确信会有一个明显的答案,但我在官方文档和互联网上的任何地方都没有找到任何解决方案。

使用 Passport.js 我们必须定义两种方法,一种用于序列化,另一种用于反序列化用户会话。

来自official documentation 我读到:

只有用户 ID 被序列化到会话中,从而保持会话中存储的数据量很小。后续收到请求时,用这个ID查找用户,会恢复到req.user

我的第一个问题涉及到术语序列化,根据Wikipedia

序列化是将数据结构或对象状态转换为可以存储的格式的过程

但是在一个完全由 Javascript 制作的世界中,既然用户是对象,而对象是本机的,我们为什么要序列化?我们可以将整个对象存储在会话中,有什么禁止的?

然后,反序列化是一个需要大量资源消耗的过程,因为与数据库交互。那么,为什么要在任何请求下执行反序列化呢?难道我们不能只做一次并保留结果以供进一步请求吗?

我阅读了很多关于 PassportJS 的内容,并且我能够实现登录系统,但我想澄清这些晦涩的方面。 谢谢。

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    正如您所说,会话中唯一保留的用户数据是用户 ID。如果您想将用户 id 的反序列化缓存到用户,那么您必须自己维护它(大概在内存中,因为您担心检索数据的时间)。这样做的问题是,您必须在更新用户的任何操作(可能用户更改他们的电子邮件地址或密码)上使缓存无效/更新,否则您可能会面临req.user 上的数据过期的风险。

    您暗示您正在使用数据库(而不是像 Redis 这样的内存存储),并且担心在每次请求时从数据库中获取用户的性能影响。如果不了解更多关于您的特定设置的信息,就不可能确定,但​​我认为您的担忧可能是没有根据的——基于 ID 获取用户记录的单个调用(哪些数据库已针对哪些数据库进行了很好的优化——主键索引例如,基于 SQL 的数据库)不应为请求增加任何明显的延迟。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多