【问题标题】:Yii update DB fields on browser tab closeYii 更新浏览器选项卡上的数据库字段关闭
【发布时间】:2015-05-29 01:55:51
【问题描述】:

在我的 Yii 应用程序中,我想防止同一用户同时登录。

1.当用户登录时,我将 DB 字段 logged_in 更新为 1。因此,如果同一用户再次登录,我检查此字段 (logged_in),如果它为 1,则抛出“用户已连接”。

2。如果用户闲置 30 分钟,我也会注销用户。

我想在浏览器标签关闭时执行以下操作,

1.销毁会话

2。将 DB 字段 logged_in 更新为 0。

【问题讨论】:

    标签: php jquery session yii


    【解决方案1】:

    当用户登录时,我将 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,从而使上次会话和登录无效,并强制他们重新登录。

    销毁会话

    涵盖在最后一点。

    【讨论】:

    • 在标签关闭时如何将数据库字段logged_in更新为0?
    • 不错的解决方案。我同意。在关闭选项卡上触发事件不是一个好的解决方案,您的方法要好得多。
    • @AyyanarG 我将答案更新为更具描述性-我认为您应该避免这种想法,您永远不知道是否有人禁用了 JS,并且很容易在客户端手动覆盖它。将此保留在服务器端(您只能通过服务器端触发关闭选项卡上的内容)
    • @ChenAsraf 关闭 yii 应用程序后,没有运行 php 代码将这个 logged_in 字段值设置为 0
    • 看看我写的——你根本不需要logged_in 字段。我之前的评论也打错了,你只能通过客户端**端触发关闭选项卡上的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2015-03-19
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多