使用 PHP 注销非活动用户

Posted

技术标签:

【中文标题】使用 PHP 注销非活动用户【英文标题】:Logout an inactive user using PHP 【发布时间】:2015-08-18 20:05:06 【问题描述】:

我正在尝试在一定时间后将用户从我的 CMS 中注销。不活动是指没有单击鼠标或在键盘上键入。因此,在 30 分钟不活动后,我的注销功能运行。

我正在使用的 CMS 中已经内置了一个注销功能 -

<?php
session_start();
if (isset($_SESSION['user_id']))
    $login = 1;
else
    $login = 0;


function confirm_logged_in() 
    if (!isset($_SESSION['user_id'])) 
        //redirect
        header("Location: /_cms/login.php?login=0");
    

function logout()
        $_SESSION = array();
        if(isset($_COOKIE[session_name()]))
            setcookie(session_name(), '', time()-4200, '/');
           
        session_destroy();


?>

其他人编写了此代码并且它可以工作。但是我不知道注销非活动用户所需的确切时间。预设时间是 - 4200。我想知道注销需要多长时间以及是否可以将其更改为我想要的任何时间。谁能给点建议?

【问题讨论】:

【参考方案1】:

-4200 只是为了销毁cookie。通过为它们设置过去的时间来销毁 Cookie。所以向后设置 4200 秒与向后设置 1 秒一样有效。

注销用户有多种方法。您可以使用上次活动时间设置您自己的 cookie(设置用户每次访问页面的时间)。在每个脚本的开头包含一个函数,该函数获取此 cookie 并检查应包含上次活动时间的值。如果此时间早于您允许的非活动时间,则销毁此 cookie 并同时销毁您的会话,如果不是,则将该值更新为当前时间。

当然,您也可以将上次活动时间存储在会话本身中,这是一种更有效的方式,可以消除 cookie 传输和管理的开销。

编辑

以下是检查上次活动时间和注销用户的最小代码:

function login()
    //check login username/pass etc...
    $_SESSION['last_active_time'] = time();


function auth()
   if($_SESSION['last_active_time'] < (time() - 1800)) //1800 is 30 minutes (time in seconds)
        logout(); //destroy the session in the logout function
    
    else
        $_SESSION['last_active_time'] = time();
    
   //do some auth related things

这就是这背后的基本逻辑。当然,您需要实现其他所需的东西以及安全性、检查等......

【讨论】:

所以如果我将时间更改为 1800,它会在 30 分钟不活动后注销? 不完全!正如我所提到的,将 set_cookie 函数的时间参数设置为过去的时间将自动删除它。我会编辑答案告诉你怎么做。【参考方案2】:

我会尽量回答你的问题,也有一些问题。

    您使用的是什么 CMS?如果您可以命名CMS,我们可以提供详细准确的解决方案 关于您的函数 logout() 以及关于 setcookie 和 -4200,每当您调用函数 logout 时,它都会检查是否存在是任何 cookie 集。如果是,那么它只是将 EXPIRY TIME 设置为 4200 秒前,即从当前时间开始 7 分钟前。 IE。它使当前存在的 Coockie 无效。 参考链接:http://php.net/manual/en/function.setcookie.php

    现在,您想要的是在 30 分钟不活动后,用户应该退出。您当前的代码不是为此而构建的。您应该编写逻辑以继续检查上次活动时间,如果超过 30 分钟,则应调用 logout 函数。现在的问题是,怎么办?我只是稍微修改一下你的代码

    if (isset($_SESSION['user_id']))
        $login = 1;
        // If the user has performed action within 30 minutes
        if($_SESSION['last_active_on'] > (time() - (30*60)))
            $_SESSION['last_active_on'] = time();   // Re-set the current time as Last Active
        else
            // User has done some action after 30 minutes.
            logout();   // Invoke the Logout functionality
            
    else
        $login = 0;
    
    

记住:time() 返回当前时间,以自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的秒数为单位。

您尚未在此处添加 登录 功能。您应该修改您的登录功能,并应在其中添加一行 $_SESSION['last_active_on'] = time();

还有一件事。只有当请求被发送到服务器时,所有这些才会发生。例如:假设在下午 4:00,由于某些操作,有一个服务器调用。假设在 4:25,您正在移动鼠标光标或单击页面上的任意位置,但如果它没有向服务器发送任何请求,则它本身被视为处于非活动状态。在下午 4:35,如果用户执行了将请求发送到服务器的操作 [普通请求或 Ajax], 然后根据服务器,它处于 35 分钟非活动状态,因此它将注销。希望这能回答您的问题。

您甚至可以参考 SO 问题:User Inactivity Logout PHP 它也可能对您有所帮助。

【讨论】:

嗨@jonlloyd,我假设您使用的是 Silverstripe CMS,因为我在这里找到了您的其他类似帖子:***.com/questions/30526802/… 不,我使用的是定制的 CMS。

以上是关于使用 PHP 注销非活动用户的主要内容,如果未能解决你的问题,请参考以下文章

如果不活动10分钟,我如何使用php上的会话注销用户[重复]

用户不活动注销 PHP

如果用户在特定时间内不活动,如何使用 codeigniter 自动注销

当用户在页面 javascript 或 php 中不活动 3 分钟时自动注销

Symfony 4:由管理员注销活动用户

如何在php中检测用户是不是已注销?