员工注意: 此问题及相关答案已锁定,以防止围绕与当前问题相关的a current event进行主题讨论。有关此活动的问题 can be found on our meta site。谢谢!
我希望能够将用户从我在Code Igniter中构建的应用中注销。
我知道如何结束有效的本地会话:
$this->session->sess_destroy();
但是,如何销毁在另一台计算机上启动的会话,从而将用户从会话中删除?
我在会话数据中存储了与其帐户关联的唯一ID,因此我可以在数据库的会话表中看到它,但它与其他会话数据一起存储在名为user_data的列中,其内容看起来像这样:
a:4:
{s:9:"user_data";s:0:"";s:6:"userid";s:6:"189034";s:9:"logged_in";b:1;s:5:"token";i:1767727789;}
其中189034
是用户的ID。
那么,有没有办法以某种方式根据用户的id选择会话表中的行,然后删除该行并销毁会话。或者还有另一种方法可以完全做到这一点吗?
答案 0 :(得分:31)
在ci_session表中创建一个新列。
ALTER TABLE `yourdatabase`.`ci_sessions`
ADD COLUMN `userid` VARCHAR(45) NULL AFTER `user_data` ;
然后在您的登录功能中获取登录过程中的ID,并在将用户数据信息添加到会话之前执行:
//delete any existing sessions with the current userid session.
// Note - a new session has already been generated but doesn't have a value
// in the userid column, so won't get deleted.
$this->db->delete('ci_sessions',array('userid' => $identity));
//get the current session and update it with the userid value.
$session_id = $this->session->userdata('session_id');
$this->db->where('session_id', $session_id);
$this->db->update('ci_sessions', array('userid' => $identity));
其中$ identity是您的用户ID。这会清除之前的所有会话,并且意味着一次只存在一个会话。
答案 1 :(得分:4)
有破坏你想要的一些项目/会话的功能
$this->session->unset_userdata('session_name')
要允许一个用户一次登录一台计算机或一次登录一个浏览器,您可以在此处阅读更多内容
答案 2 :(得分:3)
序列化数据的一个问题是没有合法的方法来查询它。您必须让会话中的所有用户(可能是批次)并解压缩数据,检查值,然后删除会话表中的行,从而有效地销毁该会话。
foreach ($this->db->get('sessions')->result() as $session)
{
$data = unserialize($session->user_data);
if ( ! isset($data['user_id'])) continue;
if ($data['user_id'] === $id_to_delete)
{
// delete the row
$this->db->where('session_id', $session->session_id)
->delete('sessions');
}
}
我可能会劝阻这个。您网站上的每个用户,无论是否登录,都有一个必须通过的会话,并记住:一个用户可能有多个会话,因此您必须遍历每个用户。
另一种方法可能是使用用户ID(或id的哈希)向会话表添加自定义列。您可以查询以快速查找用户会话的内容。然后,当您将user_id添加到会话时,填充此列,当您需要通过user_id删除会话时,可以快速有效地完成。