从网站完全注销用户


logging out a user completely from a website

我有一个PHP login和注销脚本,我试图实现的是,当用户单击注销链接时,无论单击浏览器的后退按钮,他都会完全注销,并且不希望用户访问该页面login

这是登录功能

function loggedin() {
    if ( isset($_SESSION['user_id']) && !empty($_SESSION['user_id']) ) {
        return true;
    } else{
        return false;
    }
}

这是我的注销脚本

<?php
include 'includes/connect.php';
include 'includes/functions.php';
session_destroy();
header('location: index.php');
?>

我怎样才能做到这一点??

您可以删除所有饼干

if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484

如果您有一组用于登录身份验证的 cookie 名称,则应仅使用它们迭代循环。

问题是完全从网站注销用户,而不仅仅是如何销毁 PHP 会话,所以我的答案会稍微复杂一些。

由于您正在使用 PHP 的$_SESSION功能来处理用户会话,因此您特别可以将当前会话 ID 绑定到用户帐户。然后,您可以轻松地强制会话过期。

例如,在用户数据库中创建一个新字段,并调用它active_session_id或其他东西。每次用户登录时,将session_id()输出保存到其中。然后在loggedin()函数内部检查当前请求的session_id()是否与用户登录时保存的匹配,如果不匹配,该函数将返回 false,因此这就是您虚拟结束用户会话的方式。也就是说,即使它实际上仍然存在,它也将不再有效。

值得注意的是,上面的解决方案将是一种one-to-one关系,即一个用户只能有一个活动会话。如果你想允许用户同时来自不同的地方,你必须通过创建一个新的表来保持one-to-many关系,例如。 users_sessions并保存会话 ID。请不要在当前用户表中创建其他字段,如active_session_id_1active_session_id_2等,因为这不被认为是一种好的做法。

希望这有帮助

您可以编写一个通用函数来检查用户是否已登录,如果不是像这样重定向他们

function isLoggedIn(){
    if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){
        //do what you want
    } else{
        header("location:youloginpage.php");
    }
}

如果你不在你的问题上指定更多,我们只能通过假设来推进。无论如何,由于您正在使用该会话,并且不清楚是否要销毁包含的数据,因此可以通过以下方式修改检查用户是否已登录的功能:

function loggedin() {
    if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
        return true; //user is logged in
        //other operations to be performed
    } else{
        return false; //user is NOT logged in
        //other operations to be performed
    }
}

注销功能可以是这样的:

function logout() {
    if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
        $_SESSION['user_id'] = -1; //"unsets" the user, while not destroyng session
    } else{
        return false; //user is already logged out - do nothing
    }
}