在创建Web应用程序时,假设您有一个表示单个用户的User对象,您认为存储用户登录的最佳方式是什么?
我想到的两种方式是:
在会话变量中存储用户数据库ID
将整个用户对象存储在会话变量中
有任何更好的建议,使用上述方法的任何问题?也许安全问题或内存问题等等
我建议存储id而不是对象.缺点是每次想要获取该用户的信息时都必须访问数据库.但是,除非页面中的每毫秒计数,否则性能不应成为问题.这有两个好处:
如果用户的信息以某种方式发生变化,那么您将不会在会话中存储过时的信息.例如,如果管理员授予用户额外权限,那么这些权限将立即可用,而无需用户注销然后重新登录.
如果会话信息存储在硬盘驱动器上,则只能存储可序列化数据.因此,如果您的User对象包含任何类似数据库连接,打开套接字,文件描述符等的内容,那么这将无法正确存储,也可能无法正确清理.
在大多数情况下,这些问题不会成为问题,任何一种方法都可以.
出于安全考虑,我将生成(GUID或加密安全的RNG)会话ID,并且具有仅将会话ID映射到用户ID的表.然后,您只需将会话ID存储在其Cookie中,并将其作为用户ID的代理.
|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|
有了这个,没有人可以通过猜测他们的ID冒充另一个用户.它还允许您限制用户的会话,因此他们必须经常登录(通常是两周).如果您想存储有关其会话的其他数据,您只需将其添加到此表即可.