存储登录的用户详细信息

时间:2020-03-05 18:41:46  来源:igfitidea点击:

当创建一个Web应用程序时,假设我们有一个表示单个用户的User对象,我们认为存储该用户已登录的最佳方法是什么?

我考虑过两种方法:

  • 将用户数据库ID存储在会话变量中
  • 将整个用户对象存储在会话变量中

是否有更好的建议,使用上述方式有任何问题?可能是安全性问题或者内存问题,等等,等等。

解决方案

回答

只需记住,如果我们在会话中存储了所有用户的属性(这扩展到权限),那么对用户的任何更改将在用户再次登录后才生效。

就个人而言,我存储名称和ID以供快速参考,并在需要时获取其余信息。

回答

我认为这取决于我们使用的平台。如果我们使用的是ASP.net,那么我肯定会看一下FormsAuthentication类以及其中所有可用于存储登录用户设置的内置(和可扩展)功能。

回答

在大多数情况下,存储ID是最佳做法。一个重要的原因是可伸缩性。如果存储用户对象(或者数据库中的任何实体,而不仅仅是它们的ID),则会在扩展服务站点的服务器数量时遇到问题。欲了解更多信息,谷歌的"无共享架构"。

回答

通常,我将用户存储在会话中。更改后,可以通过将会话中的对象替换为新副本来解决无法更改直到登录的问题。

回答

我们的用户对象相当轻巧,因此我们选择将其存储在会话变量中。不知道这是否是最有效的,但到目前为止,它是否工作得非常好。

回答

我建议存储id而不是对象。缺点是,每次要获取该用户的信息时,都必须访问数据库。但是,除非每毫秒都在页面中计数,否则性能应该不是问题。这里有两个优点:

  • 如果用户信息有所更改,那么我们将不会在会话中存储过时的信息。例如,如果管理员授予用户额外的特权,则这些特权将立即可用,而无需用户注销然后重新登录。
  • 如果会话信息存储在硬盘驱动器上,那么我们只能存储可序列化的数据。因此,如果User对象包含数据库连接,打开套接字,文件描述符等内容,则该对象将无法正确存储,也可能无法正确清除。

在大多数情况下,这些问题不会成为问题,并且两种方法都可以。

回答

为了安全起见,我将生成(GUID或者加密安全的RNG)会话ID,并具有一个仅将会话ID映射到用户ID的表。然后,我们只需将会话ID存储在他们的cookie中,并使其充当用户ID的代理即可。

|Session |UserID |

  |--------+-------|

  |a1d4e...+ 12345 |

  |--------+-------|

  |c64b2...+ 23456 |

  |--------+-------|

这样,任何人都无法通过猜测其ID来冒充其他用户。它还允许我们限制用户的会话,因此他们必须经常登录(通常两周)。而且,如果我们要存储有关其会话的其他数据,则可以将其添加到此表中。

回答

我将存储用户ID和会话ID的哈希值,然后将其与数据库中的会话表匹配。这样,将很难欺骗会话数据。我是否也可以检查IP作为额外检查。

不确定我是否要依赖存储在会话变量中的userid并相信它是那个用户,因为可以很容易地更改它并获得另一个成员的访问权限