销毁Code Igniter中的特定会话

时间:2012-03-05 08:35:11

标签: codeigniter session destroy

  

员工注意: 此问题及相关答案已锁定,以防止围绕与当前问题相关的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选择会话表中的行,然后删除该行并销毁会话。或者还有另一种方法可以完全做到这一点吗?

3 个答案:

答案 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')

要允许一个用户一次登录一台计算机或一次登录一个浏览器,您可以在此处阅读更多内容

Allow one session only at a time

答案 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删除会话时,可以快速有效地完成。