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

如何按路由名称访问CodeIgniter4路由元数据及权限校验

解决方案

1. 实现isAllowed($route_name)权限校验函数

你可以借助CodeIgniter的路由服务获取指定名称的路由元数据,再与当前用户角色做交集判断,具体实现如下:

步骤1:创建全局辅助函数

在app/Helpers目录下新建auth_helper.php,写入以下代码:

<?php

if (!function_exists('isAllowed')) {
    function isAllowed(string $routeName): bool
    {
        $router = service('router');
        // 通过路由名称获取对应路由信息
        $route = $router->getRouteByName($routeName);
        
        if (!$route) {
            return false;
        }
        
        // 提取路由元数据中的允许角色列表
        $allowedRoles = $route->getOptions()['allowed']['role'] ?? [];
        // 获取当前用户角色
        $userRole = session()->get('user_role');
        
        // 处理用户多角色场景,判断是否存在交集
        if (is_array($userRole)) {
            return !empty(array_intersect($userRole, $allowedRoles));
        }
        
        return in_array($userRole, $allowedRoles, true);
    }
}

步骤2:启用辅助函数

在app/Config/Autoload.php的$helpers数组中添加auth:

public $helpers = ['auth'];

使用示例

在视图或任意位置直接调用:

<?php if (isAllowed('admin_users.admin_master_page')): ?>
    <a href="<?= route_to('admin_users.admin_master_page') ?>">用户管理主页</a>
<?php endif; ?>

2. 通过路由组别名获取组内所有路由

CodeIgniter的路由组别名会自动作为前缀添加到子路由的as属性中(比如组别名admin_users下的子路由admin_master_page,最终路由名称为admin_users.admin_master_page),据此可以筛选出组内所有路由:

实现辅助函数

在auth_helper.php中添加以下函数:

if (!function_exists('getRoutesByGroupAlias')) {
    function getRoutesByGroupAlias(string $groupAlias): array
    {
        $router = service('router');
        $allRoutes = $router->getRoutes();
        $groupRoutes = [];
        
        $prefix = "{$groupAlias}.";
        $prefixLength = strlen($prefix);
        
        foreach ($allRoutes as $route) {
            $routeName = $route->getName();
            // 筛选名称以组别名前缀开头的路由
            if ($routeName && str_starts_with($routeName, $prefix)) {
                $groupRoutes[] = [
                    'name' => $routeName,
                    'options' => $route->getOptions(),
                    'uri' => $route->getUri()
                ];
            }
        }
        
        return $groupRoutes;
    }
}

使用示例

获取admin_users组下的所有路由并渲染有权限的链接:

$userGroupRoutes = getRoutesByGroupAlias('admin_users');

foreach ($userGroupRoutes as $route) {
    if (isAllowed($route['name'])) {
        // 可给路由添加label元数据用于显示文本
        echo "<a href='".route_to($route['name'])."'>{$route['options']['label']}</a>";
    }
}

优化建议

可以给路由新增label元数据,方便直接在视图中显示链接文本:

$routes->get('', 'AdminControllers\ViewController::users_main_page', [
    'as' => 'admin_master_page',
    'allowed' => [
        'role' => ['admin', 'super_admin', 'owner'],
    ],
    'label' => '用户管理主页'
]);

内容的提问来源于stack exchange,提问作者Black Devil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:10:11