首页 > 解决方案 > 删除远程用户的会话 - 在 PHP 中远程注销 - Codeigniter

问题描述

我正在使用数据库将用户会话保存在 codeigniter 中。

$sess_array = array('id' => $new_cus_id,
                    'cus_email' => $email);
$this->session->set_userdata('logged_in',$sess_array);

配置:

$config['sess_driver']          = 'database';  // select database driver
$config['sess_save_path']       = 'ci_sessions';  // name of the mysql table
$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_match_ip']        = TRUE;
$config['sess_time_to_update']  = 300;
$config['sess_regenerate_destroy'] = TRUE;

在数据库表中,有一个id, ip_address, timestamp, data (blob). 如何找到特定用户的会话数据并将其删除以使在线会话无效。

标签: phpcodeignitersessioncodeigniter-3

解决方案


一个可以帮助你的肮脏把戏。

您可以通过在会话表上执行类似操作来找到属于特定电子邮件的会话

select id, ip_address, cast(data as char(1000)) datablob
from internal.ci_sessions
having datablob like '%email@domain.com%';

您可能会在当前活动的会话中遇到属于先前会话的多个条目。

找到它们后,只需删除这些行,会话将有效终止,用户将被迫重新登录

请注意:这不是您应该经常做的事情。如果碰巧碰了不应该碰的东西,弄乱会话表可能会导致不良影响。此外,如果您的会话表在使用了数月/数年而没有定期清理后变得很大,如果表需要重新索引,删除一行或多行可能会导致暂时的性能影响。不要说我没有警告你:)

如果这不是您在紧急情况下需要做的事情并且可以花时间对其进行编码,那么我的建议就是我通常会做的事情(是的,有偏见的建议,我知道 :))

1.- 将“强制注销”字段添加到包含您的用户信息的表中。

默认此字段为“N”或类似的东西。在每个页面视图上(我在控制器的构造上执行此操作),查询用户表中的标志。如果返回“N”,则跳至用户正在执行的任何操作。

2.- 如果有注销标志,则注销用户

如果标志返回为“Y”,则销毁用户的会话并将用户重定向到您的登录页面。在这样做之后(您也可以在成功登录时这样做)记住将标志重置为 N 以防止用户进入注销循环。

这会为每个综合浏览量添加一个查询,但影响应该可以忽略不计


推荐阅读