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

如何在Adminer中限制用户仅修改特定条件的数据行

实现Adminer行级数据修改限制

你可以通过在Adminer自定义扩展类中添加专用函数,结合已有的表限制逻辑,实现仅允许用户修改符合特定条件的数据行,具体方案如下:

1. 限制可见数据行(仅展示符合条件的内容)

添加selectQuery函数,在查询目标表时自动追加WHERE条件,确保用户只能看到branch_id=10的数据:

function selectQuery($query, $start, $limit, $order) {
    global $TABLE_NAME;
    // 仅对目标表生效
    if (stripos($query, "FROM `$TABLE_NAME`") !== false) {
        $condition = " branch_id = 10";
        // 原查询无WHERE子句则直接添加,有则追加AND条件
        if (stripos($query, "WHERE") === false) {
            $query .= " WHERE" . $condition;
        } else {
            $query .= " AND" . $condition;
        }
    }
    return parent::selectQuery($query, $start, $limit, $order);
}

2. 拦截修改/删除操作(防止越权操作)

添加editQuery和deleteQuery函数,强制在修改、删除请求中追加条件,确保用户只能操作branch_id=10的行:

function editQuery($table, $id, $values, $update) {
    global $TABLE_NAME;
    if ($table === $TABLE_NAME) {
        $update .= " AND branch_id = 10";
    }
    return parent::editQuery($table, $id, $values, $update);
}

function deleteQuery($table, $id) {
    global $TABLE_NAME;
    if ($table === $TABLE_NAME) {
        $query = parent::deleteQuery($table, $id);
        $query .= " AND branch_id = 10";
        return $query;
    }
    return parent::deleteQuery($table, $id);
}

3. 完整自定义类示例

将上述函数与你已有的tableName函数整合到同一个Adminer扩展类中:

class AdminerCustom extends Adminer {
    function tableName($tableStatus) {
        global $TABLE_NAME;
        if($tableStatus['Name']==$TABLE_NAME)
            return $TABLE_NAME;
    }

    function selectQuery($query, $start, $limit, $order) {
        global $TABLE_NAME;
        if (stripos($query, "FROM `$TABLE_NAME`") !== false) {
            $condition = " branch_id = 10";
            if (stripos($query, "WHERE") === false) {
                $query .= " WHERE" . $condition;
            } else {
                $query .= " AND" . $condition;
            }
        }
        return parent::selectQuery($query, $start, $limit, $order);
    }

    function editQuery($table, $id, $values, $update) {
        global $TABLE_NAME;
        if ($table === $TABLE_NAME) {
            $update .= " AND branch_id = 10";
        }
        return parent::editQuery($table, $id, $values, $update);
    }

    function deleteQuery($table, $id) {
        global $TABLE_NAME;
        if ($table === $TABLE_NAME) {
            $query = parent::deleteQuery($table, $id);
            $query .= " AND branch_id = 10";
            return $query;
        }
        return parent::deleteQuery($table, $id);
    }
}

注意事项

  • 确保全局变量$TABLE_NAME已正确定义为目标表名
  • 若branch_id为字符串类型,需将10修改为'10'
  • 该方案既限制了界面可见内容,又拦截了底层SQL请求,避免用户通过构造请求越权操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:01:22