创建Web应用程序时,假设您有一个表示单个用户的User对象,您认为存储用户登录的最佳方式是什么?
我想到的两种方式是:
任何更好的建议,使用上述方法的任何问题?也许是安全问题或内存问题等等。
答案 0 :(得分:11)
我建议存储id而不是对象。缺点是每次想要获取该用户的信息时都必须访问数据库。但是,除非页面中的每毫秒计数,否则性能不应成为问题。这有两个好处:
如果用户的信息以某种方式发生变化,那么您将不会在会话中存储过时的信息。例如,如果管理员授予用户额外的权限,那么这些权限将立即可用,而无需用户注销然后重新登录。
如果会话信息存储在硬盘驱动器上,则只能存储可序列化数据。因此,如果您的User对象包含任何类似数据库连接,打开套接字,文件描述符等的内容,那么这将无法正确存储,也可能无法正确清理。
在大多数情况下,这些问题不会成为问题,任何一种方法都可以。
答案 1 :(得分:6)
出于安全考虑,我会生成(GUID或加密安全的RNG)会话ID,并且只有一个表将会话ID映射到用户ID。然后,您只需将会话ID存储在其Cookie中,并将其作为用户ID的代理。
|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|
有了这个,没有人可以通过猜测他们的ID冒充另一个用户。它还允许您限制用户的会话,因此他们必须经常登录(通常是两周)。如果您想存储有关其会话的其他数据,您只需将其添加到此表中即可。
答案 2 :(得分:3)
请记住,如果您在会话中存储了所有用户的属性(这扩展到权限),那么对用户的任何更改都将在他们再次登录之后生效。
就个人而言,我存储名称和ID以供快速参考,并在需要时获取其余部分。
答案 3 :(得分:2)
在大多数情况下,存储ID是最佳做法。一个重要原因是可扩展性。如果存储用户对象(或数据库中的任何实体,而不仅仅是其ID),则会遇到扩展为站点提供服务的服务器数量的问题。有关更多信息,请访问“无共享架构”。
答案 4 :(得分:1)
我认为这取决于您使用的平台。如果您使用的是ASP.net,那么我肯定会查看FormsAuthentication类以及可用于存储登录用户设置的所有内置(和可扩展)功能。
答案 5 :(得分:1)
我会存储用户ID和会话ID的散列值,然后在数据库的会话表中将其匹配。这样,欺骗会话数据将更加困难。我可以检查IP作为额外的检查。
不确定我是否希望依赖于存储在会话变量中的用户ID并相信它是该用户,因为它可以相当容易地更改并获得作为另一个成员的访问权
答案 6 :(得分:0)
我通常会将用户存储在会话中。在您进行更改后,可以通过使用新副本替换会话中的对象来解决无法更改直到登录问题。
答案 7 :(得分:0)
我们的用户对象相当轻量级,因此我们选择将其存储在会话变量中。不确定这是否最有效,但到目前为止它的工作非常好。