存储登录的用户详细信息

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

我想到的两种方式:

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

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

请先 登录 后评论

7 个回答

tHeSmUrF

我通常将用户存储在会话中。 can't-change-until login 问题可以通过在您进行更改后用新副本替换会话中的对象来解决。

请先 登录 后评论
Chuck

我们的用户对象相当轻量,因此我们选择将其存储在会话变量中。不确定这是否最有效,但到目前为止效果很好。

请先 登录 后评论
Andrew

我将存储用户 ID 和会话 ID 的散列值,然后将其匹配到数据库的会话表中。这样就更难欺骗会话数据。我也可以检查 IP 作为额外检查吗。

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

请先 登录 后评论
tghw

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

<块引用>

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

有了这个,没有人可以通过猜测他们的 ID 来冒充另一个用户。它还允许您限制用户的会话,因此他们必须每隔一段时间登录一次(通常为两周)。如果您想存储有关他们会话的其他数据,只需将其添加到此表中即可。

请先 登录 后评论
Eli Courtwright

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

  1. 如果用户的信息以某种方式发生变化,那么您将不会在会话中存储过时的信息。例如,如果管理员授予用户额外权限,那么这些权限将立即可用,用户无需注销然后重新登录。

  2. 如果您的会话信息存储在硬盘驱动器上,那么您只能存储可序列化的数据。因此,如果您的 User 对象曾经包含诸如数据库连接、打开的套接字、文件描述符等内容,那么这将无法正确存储,也可能无法正确清理。

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

请先 登录 后评论
mercutio

请记住,如果您将所有用户的属性(这扩展到权限)存储在会话中,则对用户的任何更改都不会生效,直到他们再次登录。

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

请先 登录 后评论
John

在大多数情况下,存储 ID 是最佳做法。这样做的一个重要原因是可扩展性。如果您存储用户对象(或数据库中的任何实体,而不仅仅是它们的 ID),您将遇到扩展为您的站点提供服务的服务器数量的问题。有关更多信息,请谷歌搜索“无共享架构”。

请先 登录 后评论