如何防止ci_sessions(数据库表)中的每个用户多个会话?

时间:2019-02-11 10:11:08

标签: php codeigniter-3

我正在尝试避免每个用户登录我的应用程序时出现多个会话。假设当前行为是通过时间戳重新生成会话,所以每个用户将有多个会话,我想避免这种情况。

我当前的表格如下:

  • ci_sessions

    • id
    • user_id
    • 用户名
    • 角色
    • 主题颜色
    • ip_address
    • 时间戳
    • 数据
  • 用户

    • id
    • session_id
    • 用户名
    • 角色
    • 主题颜色

我本人是基于以下教程:Prevent Multiple Concurrent Logins in Codeigniter

这就是我的控制器中的内容:

$getUsername    =   $this->PublicSession_model->getUsername($username);

// SessionData
$sessionData    =   array(
    'user_id'       =>  $getUsername->id,
    'username'      =>  $getUsername->username,
    'role'          =>  $getUsername->role,
    'theme_color'   =>  $getUsername->theme_color,
);
// Set SessionData
$this->session->set_userdata($sessionData);

// Create new session
$id         =   $getUsername->id;
$sessionID  =   session_id();

// Update UseridData in CI_SESSION DB TABLE
$this->PublicSession_model->setSession($id, $sessionID, $sessionData);

这是我在模型中使用的两种方法:

public function getUsername($username) {
    // select field we needed
    $this->db->select('*');
    $this->db->where('username', $username);
    $this->db->where('token', ''?:NULL);
    $this->db->where('status', 'active');
    $this->db->limit(1);

    $query = $this->db->get($this->users);

    // check is $query have a data ?
    if ($query->num_rows() > 0) {
        // return data
        return $query->row();
    } else {   
        // redirect login, because no data with that username
        redirect('accounts/login');
    }
}

public function setSession($id, $sessionID, $sessionData){
    // Get previous mapped session
    $oldSessionId = $this->db->select('id')->where(array('id' => $id))->get($this->users)->row('session_id');

    // Destroy old session mapped to previous user
    $this->db->where('user_id', $oldSessionId);
    $this->db->delete('ci_sessions', $sessionData);

    // Map new session ID to the user
    $this->db->where('id', $id);
    $this->db->update($this->users, array('session_id' => $sessionID));
}

我想做的是根据成功登录后将要创建的新session_id更新users表中每列'session_id'的行。

我的功能不是获取上面的语句,而是更新具有相同会话的用户表中每个用户的session_id列。

0 个答案:

没有答案