CodeIgniter如何实现禁止多端登录 仅允许单设备单浏览器登录
基于CodeIgniter ci_session实现单账号单端登录方案
核心逻辑
将用户账号和当前有效会话ID做唯一绑定,每次请求校验当前会话ID和绑定的ID是否一致,不一致则判定为非法登录态直接下线。
具体实现步骤
- 调整数据库结构
给用户表(示例表名users)新增current_session_id字段,类型设为varchar(128),默认值为空,用于存储当前登录有效的会话ID。 - 登录时绑定会话ID
账号密码校验通过后,获取当前会话ID写入用户表,旧设备的旧会话ID会被直接覆盖失效:$current_sid = session_id(); $this->db->where('id', $login_user_id)->update('users', ['current_session_id' => $current_sid]); - 全局校验登录态
用CI的pre_controller钩子或者公共基础控制器的构造方法,全局校验所有需要登录权限的请求:// 先校验是否存在基础登录态 $user_id = $this->session->userdata('login_user_id'); if (empty($user_id)) { redirect('/login'); } // 再校验当前会话ID是否和账号绑定的有效ID一致 $bind_sid = $this->db->where('id', $user_id)->get('users')->row_array()['current_session_id'] ?? ''; if (session_id() !== $bind_sid) { // 不一致则清空当前会话,强制下线 $this->session->sess_destroy(); redirect('/login?msg=您的账号已在其他设备登录'); } - 登出时清除绑定
用户主动登出时,同步清空用户表的绑定会话ID,释放登录名额:$user_id = $this->session->userdata('login_user_id'); $this->db->where('id', $user_id)->update('users', ['current_session_id' => '']); $this->session->sess_destroy();
注意事项
- 如果你开启了CodeIgniter的
session_regenerate_id配置(默认开启,用于防止会话劫持),需要在每次会话ID再生后,同步更新用户表的current_session_id字段,避免合法用户被误踢。 - 未主动登出的过期会话会跟随ci_session的自动清理机制失效,不会影响后续新登录请求。
内容的提问来源于stack exchange,提问作者irwan dwiyanto
相关产品推荐
相关产品推荐

