用户会话ID已更改为使用codeigniter 3

时间:2017-12-29 09:56:48

标签: php ajax codeigniter

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

User A

用户B登录并成功通过用户B的会话重定向到主页

User B

但是用户A的会话立即更改为用户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中登录的用户A在浏览器B中更改为用户B,过了一段时间后,浏览器A中的用户A(已更改为用户B)再次更改对于用户A,在此更改后,浏览器B中的用户B变为用户A.

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

1 个答案:

答案 0 :(得分:1)

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

在允许登录之前,您需要进行测试以确定该关系是否已存在。

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的惯例,所有UPPERCASE都用于表示常量。您应该考虑将来可能为其他阅读此代码的开发人员创建的混淆。考虑这样做:

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