我正在使用数据库将用户会话保存在codeigniter中。
read()
配置:
$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;
。
如何找到特定用户的会话数据并将其删除以使在线会话无效。
答案 0 :(得分:1)
一个肮脏的把戏可能会帮助您。
您可以通过在会话表中执行类似的操作来找到属于特定电子邮件的会话
select id, ip_address, cast(data as char(1000)) datablob
from internal.ci_sessions
having datablob like '%email@domain.com%';
您可能会在当前活动的会话中遇到多个属于先前会话的条目。
找到它们后,只需删除这些行,会话将被有效终止,并且用户将被迫重新登录
请注意:这不是您应该经常做的事情。如果碰巧碰到了不应该碰到的东西,则与sessions表打交道可能会导致不良后果。另外,如果会话表在使用数月/年后变得很大而又没有定期整理,那么如果该表需要重新索引,则删除一个或多个行可能会对性能产生暂时的影响。不要说我没有警告过你:)
如果这不是您在紧急情况下需要做的事情,并且可以花一些时间编写代码,那么我的建议就是我通常要做的(是的,有偏见的建议,我知道:))
1.-将带有您的用户信息的“强制注销”字段添加到表中。
默认将此字段设置为“ N”或类似名称。 在每个页面视图上(我在控制器的结构上执行此操作),在用户表中查询该标志。如果返回“ N”,请跳至用户要执行的操作。
2.-如果存在注销标志,则注销用户
如果标志返回为“ Y”,则破坏用户的会话并将用户重定向到您的登录页面。完成此操作后(您也可以在成功登录后执行此操作),请记住将标志重置为N,以防止用户进入注销循环。
这会向每个综合浏览量添加一个查询,但是影响应该可以忽略不计
答案 1 :(得分:-1)
与在会话中设置用户数据类似,您可以按照codeigniter文档使用以下方法取消设置用户数据:
$sess_array = array('id' => $new_cus_id,
'cus_email' => $email);
$this->session->unset_userdata($sess_array);
答案 2 :(得分:-2)
只需使用$this->session->set_userdata('my_custom_session_data',true)
设置自定义会话数据,每个要检查的地方都使用if($this->session->userdata('my_custom_session_data') == true)
。或将其删除$this->session->unset_userdata('my_custom_session_data')
或$this->session->userdata('my_custom_session_data','')