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

基于CodeIgniter 4与Shield权限构建HTML表格的问题求助

CodeIgniter Shield 权限表格修复方案

环境与需求

基于CodeIgniter 4.3.3、Shield 1.0.0-beta.5及MySQL,需结合auth_permissions_users、sidebar_modules、sidebar_modules_sub三张表构建HTML权限表格,权限格式采用controller.permission替代Shield默认的Group.Permission。

现有问题

  1. 用户缺失的权限未在表格中填充,导致列结构不完整
  2. 权限顺序受数据库存储影响,表格列出现错位

解决步骤

1. 定义固定权限操作与列顺序

先明确固定的权限操作集合和表头顺序,彻底规避数据库存储顺序的干扰:

// 固定权限操作,严格按要求顺序排列
$fixedActions = ['create', 'read', 'update', 'delete'];
// 固定表头列顺序
$tableColumns = ['控制器', '创建', '读取', '更新', '删除'];

2. 补全用户缺失的权限

遍历所有控制器,对每个控制器的每类操作权限逐一检查,若用户未拥有该权限,则补全为未授权状态:

// 从sidebar_modules获取所有控制器列表
$controllers = $db->table('sidebar_modules')->get()->getResultArray();
// 将用户已拥有的权限转为键值对,方便快速查找
$userPermissions = array_column($userPermissions, null, 'permission');

// 整理完整权限数据
$completePermissions = [];
foreach ($controllers as $module) {
    $controllerName = $module['controller'];
    $controllerPermissions = ['controller' => $controllerName];
    
    // 遍历固定操作,补全缺失权限
    foreach ($fixedActions as $action) {
        $permissionKey = "{$controllerName}.{$action}";
        // 存在则取用户权限状态,不存在则设为未授权(示例用0表示)
        $controllerPermissions[$action] = isset($userPermissions[$permissionKey]) ? $userPermissions[$permissionKey]['allowed'] : 0;
    }
    
    $completePermissions[] = $controllerPermissions;
}

3. 按固定顺序渲染表格

基于整理好的完整权限数据,严格按照$tableColumns的顺序生成表头和表格内容:

// 生成HTML表格
$html = '<table class="permission-table">';
// 渲染表头
$html .= '<thead><tr>';
foreach ($tableColumns as $column) {
    $html .= "<th>{$column}</th>";
}
$html .= '</tr></thead>';

// 渲染表格内容
$html .= '<tbody>';
foreach ($completePermissions as $row) {
    $html .= '<tr>';
    // 先输出控制器名称
    $html .= "<td>{$row['controller']}</td>";
    // 按固定操作顺序输出权限状态(示例用复选框展示)
    foreach ($fixedActions as $action) {
        $checked = $row[$action] ? 'checked' : '';
        $html .= "<td><input type='checkbox' name='permissions[]' value='{$row['controller']}.{$action}' {$checked}></td>";
    }
    $html .= '</tr>';
}
$html .= '</tbody></table>';

return $html;

修改后的完整buildPermissionsTable函数

if (!function_exists('buildPermissionsTable')) {
    function buildPermissionsTable($userId) {
        $db = \Config\Database::connect();
        
        // 定义固定权限操作与列顺序
        $fixedActions = ['create', 'read', 'update', 'delete'];
        $tableColumns = ['控制器', '创建', '读取', '更新', '删除'];
        
        // 获取用户已拥有的权限
        $userPermissions = $db->table('auth_permissions_users')
            ->where('user_id', $userId)
            ->get()
            ->getResultArray();
        $userPermissions = array_column($userPermissions, null, 'permission');
        
        // 获取所有控制器(可按模块排序,保持控制器展示顺序一致)
        $controllers = $db->table('sidebar_modules')
            ->orderBy('order', 'asc')
            ->get()
            ->getResultArray();
        
        // 补全缺失权限
        $completePermissions = [];
        foreach ($controllers as $module) {
            $controller = $module['controller'];
            $permissionRow = ['controller' => $controller];
            
            foreach ($fixedActions as $action) {
                $permKey = "{$controller}.{$action}";
                $permissionRow[$action] = isset($userPermissions[$permKey]) ? $userPermissions[$permKey]['allowed'] : 0;
            }
            
            $completePermissions[] = $permissionRow;
        }
        
        // 生成HTML表格
        $html = '<table border="1" cellpadding="8" cellspacing="0">';
        // 渲染表头
        $html .= '<tr>';
        foreach ($tableColumns as $col) {
            $html .= "<th>{$col}</th>";
        }
        $html .= '</tr>';
        
        // 渲染内容行
        foreach ($completePermissions as $row) {
            $html .= '<tr>';
            $html .= "<td>{$row['controller']}</td>";
            foreach ($fixedActions as $action) {
                $checked = $row[$action] ? 'checked' : '';
                $html .= "<td><input type='checkbox' {$checked} data-perm='{$row['controller']}.{$action}'></td>";
            }
            $html .= '</tr>';
        }
        
        $html .= '</table>';
        return $html;
    }
}

修改后,既能保证所有控制器的四类权限都被填充(缺失权限默认显示为未勾选),又能严格按照指定顺序排列列,彻底解决数据库存储顺序导致的列错位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:42:44