phpMyAdmin的LDAP认证必须设为auth_type='http',否则忽略REMOTE_USER并弹出自身登录框;需显式配置每个服务器块、删除user/password字段、确保host指向MySQL实例且索引从1连续。

phpMyAdmin 的 LDAP 认证必须设为 http 才能生效
只要 $cfg['Servers'][$i]['auth_type'] 不是 'http',Apache 或 Nginx 的 LDAP 认证结果(即 REMOTE_USER)就会被 phpMyAdmin 忽略,它仍会弹自己的登录框。这不是权限问题,而是认证流程没对上——phpMyAdmin 只在 http 模式下才信任 Web 服务器传来的用户名。
必须确保每个服务器配置块里都显式写入:
$cfg['Servers'][$i]['auth_type'] = 'http';
不要依赖全局默认值;也不要混用 cookie 或 signon 在同一配置中。如果只配了第 1 个服务器为 http,第 2 个漏了,那第 2 个就永远走不了 LDAP。
LDAP 成功后连不上 MySQL?检查 host 和凭据来源
HTTP 认证只解决“你是谁”,不解决“你能不能连 MySQL”。常见错误是:$cfg['Servers'][$i]['host'] 写成了 LDAP 服务器地址(如 ldap.example.com),而它应该指向目标 MySQL 实例,比如 '127.0.0.1' 或 'db-prod'。
立即学习“PHP免费学习笔记(深入)”;
-
$cfg['Servers'][$i]['user']和$cfg['Servers'][$i]['password']必须删掉或注释——它们在http模式下无效,留着反而可能干扰连接逻辑 - MySQL 用户名由 LDAP 属性映射而来(如
uid),需提前在 MySQL 中创建同名账号,并赋予对应库表权限 - 若用的是 MariaDB 10.6+ 或 MySQL 8.0+,注意默认认证插件可能是
caching_sha2_password,本地用户需显式指定mysql_native_password兼容
多个 MySQL 服务器共用一套 LDAP,但权限不同?靠 Require 规则分流
不能靠 phpMyAdmin 配置区分权限,得在 Web 服务器层做控制。例如 Apache 的 .htaccess 或虚拟主机配置中,对不同 phpMyAdmin 路径(或子目录)设置不同 LDAP 组限制:
<Location /phpmyadmin-prod>
AuthType basic
AuthName "Prod DB Access"
AuthBasicProvider ldap
AuthLDAPURL "ldap://ldap.example.com/ou=People,dc=example,dc=com?uid?sub?(objectClass=posixAccount)"
AuthLDAPBindDN "cn=admin,dc=example,dc=com"
AuthLDAPBindPassword "secret"
Require ldap-group cn=dba,ou=Groups,dc=example,dc=com
</Location>
<Location /phpmyadmin-staging>
Require ldap-group cn=dev,ou=Groups,dc=example,dc=com
</Location>
每套路径挂载独立的 config.user.inc.php,里面只定义对应 MySQL 服务器的 $cfg['Servers'][1],auth_type 仍为 http。这样既复用 LDAP 验证,又隔离了数据库访问边界。
为什么登录后总报 #1045 Cannot log in to the MySQL server
这个错误几乎全是 MySQL 连接层的问题,和 LDAP 认证成功与否无关。排查顺序如下:
- 确认
$cfg['Servers'][$i]['host']能从 phpMyAdmin 容器或 Web 服务器所在机器直接telnet通(如telnet db-prod 3306) - 检查 MySQL 是否监听非
127.0.0.1(如bind-address = 0.0.0.0),且防火墙放行 - 确认 MySQL 中存在与 LDAP
uid同名的账号,且host匹配(如'web-server-host'@'%'或'%'@'%') - 禁用
$cfg['LoginCookieRecall']:设为false,否则 HTTP 认证流程会被 cookie 自动登录覆盖,导致跳转异常
最易忽略的一点:所有服务器配置块中的 $cfg['Servers'][$i] 索引必须从 1 开始、连续、无空缺。哪怕只配一个服务器,也不能写成 $cfg['Servers'][0] 或 $cfg['Servers'][2] —— phpMyAdmin 解析时会直接跳过整个数组。



















