CodeIgniter 4 中路由登录验证需三步:定义过滤器类(检查 session 并放行白名单路径)、在 Filters.php 中注册别名、在 Routes.php 中用 filter() 绑定;须避坑如登录页放行、CSRF 顺序、session 目录可写。

在 CodeIgniter 4 中,给路由加过滤器做登录验证,核心是「定义过滤器类 → 注册到配置 → 在路由中绑定」三步,不是写在控制器里,也不是靠中间件或手动 session 判断。它天然支持前置拦截,且能精准控制哪些路径放行、哪些必须登录。
1. 创建登录验证过滤器类
在 app/Filters/ 目录下新建一个 PHP 文件,比如 LoginFilter.php:
- 实现
FilterInterface,重写before()方法 - 检查 session 是否存在有效用户(例如
session()->get('user_id')) - 若未登录,重定向到登录页;注意区分普通请求和 Ajax 请求(避免 302 跳转破坏前端逻辑)
- 白名单路径(如
/login、/api/login、静态资源)需提前放行,否则会循环跳转
2. 在 Filters 配置中注册过滤器别名
打开 app/Config/Filters.php,在 $aliases 数组中添加:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
'login' => \App\Filters\LoginFilter::class,
这个 'login' 就是后续路由中要使用的过滤器标识名。
3. 在 Routes.php 中为路由绑定过滤器
编辑 app/Config/Routes.php,使用 filter() 方法绑定:
- 保护单个路由:
$routes->get('admin/dashboard', 'Admin::dashboard')->filter('login'); - 保护整个分组:
$routes->group('admin', ['filter' => 'login'], function($routes) { ... }); - 多个过滤器可传数组:
->filter(['login', 'csrf'])
注意:不要把 filter() 写在 group() 外部闭包里,否则不生效;也别用赋值写法(如 $routes->group(...) = function() {...}),这是常见语法错误。
4. 补充要点:避免典型坑
- 登录页自身必须放行——过滤器里对
$request->getUri()->getPath()做白名单判断,或直接在路由定义时跳过:$routes->get('login', 'Auth::login');不加filter() - CSRF 保护和登录验证过滤器顺序有影响:一般先 CSRF 再登录验证,否则未登录用户提交表单可能因无 token 被拦在更前一步
- CI4 的 session 默认基于文件存储,确保
app/ writable/sessions/可写,否则session()->get()总是返回 null - 测试时用隐身窗口,浏览器缓存 302 重定向会导致“改了没反应”的假象


















