我有一些奇怪的登录行为。当登录和成功使用用户A的会话(及其所有数据)重定向到主页时。
用户B登录并成功通过用户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.
答案 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'
];