在codeigniter中需通过路由层结合过滤器限制控制器方法访问权限,包括单路由绑定、分组批量保护及排除特定方法,且过滤器必须在routes.php中正确配置别名与路径。

要在 CodeIgniter 中限制特定控制器方法的访问权限,比如只允许登录用户调用 admin/delete_user、禁止未登录者直接访问 /api/export 或阻止非管理员调用 settings/save,必须通过路由层结合过滤器(Filter)实现——不能仅靠控制器内判断,否则绕过路由仍可触发方法执行。
启用并注册自定义过滤器
打开 app/Config/Filters.php,在 $aliases 数组中添加新过滤器别名:
$aliases = [ 'auth' => \App\Filters\AuthFilter::class, 'admin-only' => \App\Filters\AdminFilter::class,];
这一步是后续路由绑定的前提,【别名必须与类名严格对应,且类文件需存在于 app/Filters/ 目录下】。若漏写或拼错,路由绑定后将静默失效,无任何报错提示。
为单个路由绑定过滤器
在 app/Config/Routes.php 中,使用 ['filter' => 'xxx'] 选项为指定路由启用保护:
$routes->get('/admin/delete-user/(:num)', 'Admin::deleteUser/$1', ['filter' => 'admin-only']);
该行表示:只有通过 AdminFilter 验证的请求,才能访问 /admin/delete-user/123 这一路径。验证失败时,Filter 的 before() 方法会直接中断流程并跳转或返回响应,Admin::deleteUser() 永远不会被执行。
注意:过滤器在路由匹配成功后、控制器方法调用前运行,属于请求生命周期的关键拦截点。
批量限制整个控制器所有方法
使用路由分组可一次性为多个路径统一加锁:
第一步:定义分组
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
$routes->group('api', ['filter' => 'auth'], function ($routes) {
第二步:在分组内注册所有受控路由
$routes->get('export', 'Api::exportData'); $routes->post('import', 'Api::importData'); $routes->delete('clear-cache', 'Api::clearCache');
第三步:闭合分组
});
此时访问 /api/export、/api/import 等任意子路径,均强制经过 AuthFilter。这种写法比逐条绑定更安全,避免遗漏某个方法。
排除特定方法不被过滤
若某控制器大部分方法需鉴权,但其中一两个(如 login、health-check)必须公开,可在分组内单独覆盖:
$routes->group('admin', ['filter' => 'admin-only'], function ($routes) { $routes->get('dashboard', 'Admin::dashboard'); // 受限 $routes->get('login', 'Admin::login', ['filter' => '']); // 显式清空过滤器});
这里 ['filter' => ''] 是唯一能解除继承过滤器的方式,写成 null 或省略该参数均无效。










