如何在CodeIgniter中实现不可绕过的屏幕锁定功能
CodeIgniter 屏幕锁定功能实现方案
核心逻辑依赖服务端 Session 存储锁定状态 + 全局请求拦截实现,完全避免前端绕过的可能,具体实现步骤如下:
1. 基础配置准备
首先确保你的 CodeIgniter 项目已经开启并正确配置 Session 服务,锁定状态、解锁码等敏感数据全部存在服务端 Session 中,禁止存在前端本地存储。
2. 新增全局拦截逻辑(防止绕过的核心)
用全局钩子(CI3)或过滤器(CI4)拦截所有请求,只要检测到锁定状态就强制跳转锁定页,不需要每个控制器单独写校验逻辑。
以 CI3 为例:
- 先在
application/config/config.php开启钩子功能$config['enable_hooks'] = TRUE; - 在
application/config/hooks.php注册拦截钩子$hook['post_controller_constructor'] = array( 'class' => 'Lock_check', 'function' => 'check_lock_status', 'filename' => 'Lock_check.php', 'filepath' => 'hooks', ); - 新建
application/hooks/Lock_check.php写校验逻辑class Lock_check { public function check_lock_status() { $CI =& get_instance(); // 排除锁定页、解锁接口,避免死循环 $exclude_uris = ['lock/index', 'lock/unlock']; $current_uri = $CI->uri->uri_string(); // 仅校验已登录用户的锁定状态 if ($CI->session->userdata('is_logged_in') && !in_array($current_uri, $exclude_uris)) { if ($CI->session->userdata('is_locked') === TRUE) { redirect('lock/index'); } } } }
CI4 版本可以用全局 Filter 实现,逻辑完全一致。
3. 编写锁定相关功能控制器
新建 Lock.php 控制器处理锁定、解锁逻辑:
class Lock extends CI_Controller { // 展示锁定页面 public function index() { if (!$this->session->userdata('is_logged_in') || $this->session->userdata('is_locked') !== TRUE) { redirect('/'); } $this->load->view('lock_page'); } // 解锁请求处理 public function unlock() { $input_passcode = $this->input->post('passcode'); $correct_passcode = $this->session->userdata('lock_passcode'); if ($input_passcode === $correct_passcode) { // 解锁成功,清除锁定标记 $this->session->unset_userdata(['is_locked', 'lock_passcode']); $this->session->set_flashdata('success', '解锁成功'); redirect('/'); } else { $this->session->set_flashdata('error', '解锁码错误,请重试'); redirect('lock/index'); } } // 手动触发锁定的接口,可绑定到页面的锁定按钮 public function trigger_lock() { if (!$this->session->userdata('is_logged_in')) { redirect('/'); } // 设置锁定状态,解锁码可以预设也可以支持用户自定义 $this->session->set_userdata('is_locked', TRUE); $this->session->set_userdata('lock_passcode', '你的预设解锁码或者用户自定义密码'); redirect('lock/index'); } }
4. 编写锁定页视图
新建 application/views/lock_page.php,核心是用全屏层级的容器遮挡所有内容,避免用户操作页面其他区域,参考样式:
<!DOCTYPE html> <html> <head> <title>屏幕已锁定</title> <style> .lock-container { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: #f5f5f5; z-index: 99999; display: flex; align-items: center; justify-content: center; flex-direction: column; } </style> </head> <body> <div class="lock-container"> <h2>屏幕已锁定</h2> <?php if ($this->session->flashdata('error')): ?> <p style="color: red;"><?php echo $this->session->flashdata('error'); ?></p> <?php endif; ?> <form method="post" action="<?php echo site_url('lock/unlock') ?>"> <input type="password" name="passcode" placeholder="请输入解锁码" required> <button type="submit">解锁</button> </form> </div> </body> </html>
扩展功能补充
如果需要实现超时自动锁定,只要在用户每次操作时更新 Session 中的 last_active_time 字段,在全局拦截钩子中判断当前时间和最后活跃时间的差值超过设定的超时阈值时,自动将 is_locked 设为 TRUE 即可。
内容的提问来源于stack exchange,提问作者Seba gałczyński
相关产品推荐
相关产品推荐

