我有一些奇怪的登录行为。当登录和成功将用户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。
- 用户a登录,用户b登录=用户A更改为用户b。
- 一段时间后,用户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'
];