在我的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地址,旧会话将自动注销。
因此,您应该在DB中为用户提供以下字段:
ip_address | session_id | last_active
您应该不断更新last_active
字段,以便进行准确的比较。
如果用户处于非活动状态30分钟,我也会注销他。
每当用户尝试登录或进入页面时(无论如何都应该重新进行身份验证):-如果用户在过去30分钟内一直处于活动状态,并且其他信息匹配,则这是当前会话,登录为空(可以忽略并定期继续)。-如果用户在30分钟或更长时间内处于非活动状态,则应将此新登录写入旧信息。所以,新的ip地址和会话id。-如果用户一直处于活动状态,但信息不同,则抛出一个错误(正如我所说,我会避免这样做)。
您可以让会话cookie在30分钟后过期,因此如果它们处于非活动状态,将生成新的会话id。在每个页面上输入,如果用户已登录,则覆盖cookie,它将为其指定一个新的到期日期。如果距离上次活动已经超过30分钟,用户将自动获得一个新的会话id,从而取消上次会话和登录,并强制他们再次登录。
销毁会话
涵盖在最后一点。