用户会话ID更改为使用CodeIgniter 3中的AJAX登录时登录的最后一个用户



我有一些奇怪的登录行为。当登录和成功将用户a会话重定向到主页时(及其所有数据)。

用户a

用户b登录并成功地重定向到主页,用户b

会话

用户b

但是用户会话立即更改为用户B会话。因为我使用ajax,所以当我刷新页面时,配置文件的名称更改。没有刷新页面,我们将不会注意到我们是否已经登录了其他人。

这是我的登录代码

public function login_user()
{
    $condition = [
        "email" => $this->input->post('email'),
        "password" => md5($this->input->post('password'))
    ];
    $user = $this->builtbyprime->get('baper_users', $condition, 1);
    if(count($user) > 0) {
        $data = [   
            'LOGGED_IN'    => true,
            'ID'           => $user['id'],
            'USERNAME'     => $user['nama_lengkap'],
            'STATUS'       => $user['status'],
            'ACCESS_LEVEL' => 'pengguna'
        ];
        $this->session->set_userdata($data);
        redirect(base_url() . 'pengguna/homepage');
    } else {
        $this->session->set_flashdata('login', 'gagal');
        redirect(base_url());
    }
}

我的config.php

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'baperplus';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = TRUE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

在每个控制器中

public function __construct()
{
    parent::__construct();
    if($this->session->ACCESS_LEVEL != 'pengguna')
    {
        redirect(base_url());
    }
}

注意:IDK以某种方式(我认为300s)后,用户A在浏览器B中登录A中登录A中的A更改为browser B中的用户B,一段时间后用户A浏览器A(已更改为用户B)再次更改对于用户A,在此更改此更改后,浏览器B中的用户B更改为用户a。

  1. 用户a登录,用户b登录=用户A更改为用户b。
  2. 一段时间后,用户A(立即更改为B会话)刷新浏览器并更改为用户A(正确的会话数据),但是如果B刷新浏览器(查看会话数据是否互换)用户B更改为用户a又一次又一次交替。

会话是浏览器和网站之间的关系。每个浏览器/网站只能有一个会话。

您需要一个测试来确定允许登录之前是否已经存在这种关系。

public function login_user()
{
    if($this->session->LOGGED_IN)
    {
        //somebody is already logged in on this browser
        redirect(base_url('pengguna/homepage'));
    }
    //the remainder of the code as you already have it
}

与您的问题无关,但要考虑的是使用$data数组中的所有大写密钥名称。

通过PHP中的约定,所有大写量都用于指示常数。您应该考虑将来可能会给其他开发人员造成的混乱。考虑这样做:

$data = [
    'logged_in' => true,
    'id' => $user['id'],
    'username' => $user['nama_lengkap'],
    'status' => $user['status'],
    'access_level' => 'pengguna'
];

最新更新