7

我似乎找不到这个问题的直接答案。有没有一种方法可以强制登录的用户注销?我的登录系统本质上只是依赖于一个包含用户唯一 ID(存储在 mysql 数据库中)的会话。所以本质上只是...

if (isset($_SESSION['user_id'])) {
echo "You're logged in!";
} else {
echo "You need to login!";
}

但是假设我想禁止这个用户,那么我可以在我的数据库中将他们的状态更改为禁止但在用户注销并尝试重新登录之前这不会做任何事情......那么,我该如何强制这个用户注销?最好不要在每次查看页面时检查他们的状态是否已切换为“禁止”,因为这似乎对我的服务器造成了不必要的压力。任何帮助表示赞赏,谢谢。

4

9 回答 9

6

最好不要在每次查看页面时检查他们的状态是否已切换为“禁止”,因为这似乎对我的服务器造成了不必要的压力。

在每次页面加载时从数据库加载用户,而不是在会话中存储用户的副本,这是一个非常合理的解决方案。它还可以防止用户与数据库中的副本不同步(例如,您可以更改用户的属性或权限,而无需注销并重新登录)。

于 2012-05-02T04:26:46.640 回答
6

您需要在每次加载页面时检查它们,或者可能以设定的时间间隔查看 Ajax 调用以从数据库中检查它们的状态。

然后您可以使用session_destroy();来结束他们的会话。这将破坏他们的整个会话。

否则,您可以使用unset($_SESSION['user_id']);取消设置单个会话变量

于 2012-05-02T04:07:14.460 回答
1

试着把它放在每一页上......

if (isset($_SESSION['user_id'])) {

    $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] ";
    $query = mysql_query($sql);

    if(!empty(mysql_num_rows($query))){ // found the banned user
       //redirect to logout or
       //session_destroy();
    }

} else {
echo "You need to login!";
}

如果用户仍然登录...检查他/她的状态是否被禁止...如果被禁止...然后注销

于 2012-05-02T06:09:24.907 回答
0

您可以取消设置。

unset($_SESSION['user_id'])
于 2012-05-02T04:06:59.090 回答
0

您可以通过这种方式使用自定义会话处理程序,您可以完全控制会话数据在服务器上的存储位置和方式。

因此,您可以将特定用户的会话数据存储在名为<user_id>.sessionexample 的文件中。然后,要注销用户,只需删除该文件。

于 2012-05-02T04:22:23.930 回答
0

间隔中的 Ajax 调用会给服务器带来额外的负载。如果您想要实时响应您的操作(例如,当您从系统后端禁止用户时,用户将立即退出),那么您应该查看类似Server Push.

这个想法是在用户浏览您的网站时保持从服务器到浏览器的隧道打开,以便您也可以从服务器端与他们进行通信。如果您希望他们被禁止,请在您的页面中推送注销请求和进程(即通过取消会话强制注销)。

于 2012-05-02T05:07:30.913 回答
0

这对我有用,我使用的是 pHP 5.4 include 'connect.php';

  session_start();
  if(session_destroy())
  {
     header("Location: login.php");
  }
于 2015-05-29T21:24:46.697 回答
0

您可以使用session_save_path()找到 PHP 保存会话文件的路径,然后使用unlink().

一旦您删除存储在服务器中的会话文件,客户端PHPSESSIDcookie 将不再对身份验证有效,并且用户将自动退出您的应用程序。

请在使用这种方法时非常小心,如果有问题的路径是全局 /tmp 目录!除了 PHP 之外,肯定还有其他进程在那里存储临时数据。如果 PHP 为会话数据预留了自己的目录,那么它应该是相当安全的。

于 2016-12-13T04:54:30.853 回答
-1

在我看来,基于安全性,有几种方法可以做到这一点,最好的方法是: 注意:这真的很粗糙......我知道语法是错误的,它只是让你得到一个想法。

$con = mysql_connect("localhost","sampleuser","samplepass");
if (!$con)
{
$error = "Could not connect to server";
}
mysql_select_db("sampledb", $con);
$result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'");
$userdeets = mysql_fetch_array($result);
if($_SESSION['sessionvalue'] != $userdeets['sessionvalue'])
{
session_destroy();
Header('Location: logout.php');
}
else
{
$result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''");
 $sesval = mysql_fetch_array($result2);
$_SESSION['sessionvalue'] = $seshval
}

现在我知道那不是代码,但本质上你需要做的是确保安全并拥有这种能力:

  • 每次页面加载检查会话值与数据库中的值匹配。
  • 每次页面加载时,都会根据随机生成的 DB 值设置一个新的会话值。您还需要将用户名存储在会话中。
  • 如果会话 ID 不匹配,则销毁会话并重定向它们。
  • 如果匹配,则创建新的会话 ID。

如果你想禁止一个用户,你可以将他们在数据库中的 sessionvalue 设置为“BANNED”之类的值。这个值也不允许他们登录。通过这种方式,您可以通过简单的 Web 表单控制用户,还可以非常轻松地生成被禁止用户列表等。我希望我有更多时间来解释它,希望对您有所帮助。

于 2012-05-02T07:46:28.853 回答