【发布时间】:2015-05-29 01:55:51
【问题描述】:
在我的 Yii 应用程序中,我想防止同一用户同时登录。
1.当用户登录时,我将 DB 字段 logged_in 更新为 1。因此,如果同一用户再次登录,我检查此字段 (logged_in),如果它为 1,则抛出“用户已连接”。
2。如果用户闲置 30 分钟,我也会注销用户。
我想在浏览器标签关闭时执行以下操作,
1.销毁会话
2。将 DB 字段 logged_in 更新为 0。
【问题讨论】:
在我的 Yii 应用程序中,我想防止同一用户同时登录。
1.当用户登录时,我将 DB 字段 logged_in 更新为 1。因此,如果同一用户再次登录,我检查此字段 (logged_in),如果它为 1,则抛出“用户已连接”。
2。如果用户闲置 30 分钟,我也会注销用户。
我想在浏览器标签关闭时执行以下操作,
1.销毁会话
2。将 DB 字段 logged_in 更新为 0。
【问题讨论】:
当用户登录时,我将 DB 字段 logged_in 更新为 1。因此,如果同一用户再次登录,我检查此字段 (logged_in),如果它为 1,则抛出“用户已连接”。
您应该在用户尝试登录时比较 IP 和会话 ID (Yii::app()->getSession()->getSessionId())。
如果新登录名具有不同的会话 ID 和/或 IP,他们应该抛出错误(根据您的请求),但我建议避免用户忘记注销并不得不等待 30 分钟而感到沮丧,而只需覆盖旧会议。因此,如果用户在同一时间跨度从不同位置登录,您可以覆盖会话 id 和 IP 地址,旧会话将自动注销。
因此,您应该在数据库中为用户提供这些字段:
ip_address | session_id | last_active
您应该更新last_active 字段,以便比较准确。
如果用户闲置 30 分钟,我也会注销用户。
每当用户尝试登录或进入页面时(无论如何您都应该重新进行身份验证): - 如果用户在过去 30 分钟内一直处于活动状态,并且其他信息匹配,则这是当前会话并且登录为空(可以忽略并定期继续)。 - 如果用户在 30 分钟或更长时间内处于非活动状态,则此新登录信息应覆盖旧信息。因此,新的 IP 地址和会话 ID。 - 如果用户一直处于活动状态但信息不同,则抛出错误(就像我说的那样,我会避免这样做)。
您可以让会话 cookie 在 30 分钟后过期,以便在它们处于非活动状态时生成一个新的会话 ID。 在每个页面上输入,如果用户登录,覆盖 cookie,它会给它一个新的到期日期。 如果距离上次活动超过 30 分钟,用户将自动获得一个新的会话 ID,从而使上次会话和登录无效,并强制他们重新登录。
销毁会话
涵盖在最后一点。
【讨论】: