You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:30:05