在代码点火器中销毁特定的会话

员工注意:这个问题和相关的答案被locking,以防止围绕与当前问题有关的当前事件进行讨论。 关于这个事件的问题可以在我们的meta网站上find 。 谢谢!

我希望能够将用户从Code Igniter中构build的应用程序中注销。

我知道如何结束一个活跃的本地会话:

$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。

那么,有没有办法以某种方式根据用户的IDselect会话表中的行,然后删除行并销毁会话。 还是有另一种方法完全做到这一点?

在ci_session表中创build一个新列。

 ALTER TABLE `yourdatabase`.`ci_sessions` ADD COLUMN `userid` VARCHAR(45) NULL AFTER `user_data` ; 

然后在你的loginfunction从你的login过程中获得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)); 

$身份是你的用户名。 这清除了任何以前的会议,并且意味着一次只有一个存在。

有这个function可以销毁你想要的一些项目/会话

 $this->session->unset_userdata('session_name') 

并且允许一个用户一次login一台计算机,或者一次login一台浏览器,您可以在这里阅读更多信息

一次只允许一个会话

序列化数据的问题之一是没有合法的查询方法。 您必须让会话中的所有用户(可能很多 )解压缩数据,检查值,然后删除会话表中的行,从而有效地销毁会话。

 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'); } } 

我可能会劝阻这个。 你网站上的每个用户login与否,都有一个会话需要挑选,记住:一个用户可能有多个会话,所以你必须循环遍历每个会话。

另一种方法是使用用户标识(或ID的散列)将自定义列添加到会话表中。 一些你可以查询来快速find用户的会话。 然后,当您将user_id添加到会话中时,填充此列,并且在需要通过user_id删除会话时,可以快速高效地完成此操作。