phpMyAdmin本身不支持多租户隔离的服务器访问列表配置,因其$cfg['Servers']为静态全局配置,无用户角色或动态路由机制;真正隔离需依赖MySQL用户权限(如按租户限定GRANT范围)、禁用information_schema访问及phpMyAdmin登录入口控制协同实现。

phpMyAdmin 本身不支持多租户隔离的服务器访问列表配置——它只是一个 Web 界面,所有“多租户”能力必须由底层 MySQL 权限系统和 phpMyAdmin 的配置协同实现。
为什么不能在 phpMyAdmin 里直接配“多租户服务器列表”
phpMyAdmin 的 config.inc.php 中的 $cfg['Servers'] 是静态服务器定义列表,对所有用户可见(除非用 $cfg['Servers'][$i]['hide_db'] 或登录逻辑拦截)。它没有内置用户角色、租户绑定或动态服务器路由机制。所谓“多租户访问列表”,实际是:MySQL 用户账号 + 数据库权限 + phpMyAdmin 登录入口控制的组合效果。
如何让不同租户只能看到自己的 MySQL 服务器/数据库
关键不是隐藏服务器条目,而是确保租户登录后,只被授权访问指定数据库,并且看不到其他租户的库。实操要点如下:
- 每个租户使用独立的 MySQL 用户账号,例如
tenant_a、tenant_b - 为每个用户严格限制
GRANT范围,例如:GRANT SELECT, INSERT, UPDATE ON `tenant_a`.* TO 'tenant_a'@'%';
不要用ON *.*或通配符库名 - 在 phpMyAdmin 的
config.inc.php中启用$cfg['ShowDatabasesNavigationAsTree'] = true;并设置$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|sys)$';—— 这能隐藏系统库,但不会隐藏其他租户的库;真正隔离靠的是上一步的权限 - 若需彻底隐藏其他租户库名(比如不让
tenant_a在下拉列表里看到tenant_b),必须配合 MySQL 8.0+ 的partial_revokes和SHOW DATABASES权限控制,或降级使用mysqld --skip-show-databases(不推荐)
用 $cfg['Servers'] 动态切换租户对应服务器的风险点
有人试图通过修改 $cfg['Servers'] 数组,在登录时根据用户名加载不同服务器配置。这不可行,因为:
立即学习“PHP免费学习笔记(深入)”;
- phpMyAdmin 的服务器配置在脚本启动时就已解析完毕,无法按会话动态重载
- 硬编码多个
$cfg['Servers'][1]、[2]等,会导致所有用户都能在登录页下拉中看到全部服务器(除非用$cfg['AllowArbitraryServer'] = false;关闭任意服务器输入,但仍暴露列表) - 若租户共用一个 MySQL 实例,却给每人配独立服务器条目(指向同一 host/port),反而增加混淆和维护成本
- 真正安全的做法是:单服务器配置 + 多 MySQL 用户 + 严格 DB 级 GRANT + 可选的 phpMyAdmin 插件或反向代理层做登录前租户路由
最容易被忽略的是:即使租户看不到其他数据库名,只要其 MySQL 账号有 SELECT 权限在 information_schema.SCHEMATA,仍可能通过 SQL 查询枚举出其他库名。所以权限回收要彻底,包括显式 REVOKE SELECT ON `information_schema`.* FROM 'tenant_a'@'%';(MySQL 8.0.22+ 支持)。



















