空密码登录由mysql.user表中authentication_string字段为空字符串或NULL决定,而非配置开关;需同时满足plugin为mysql_native_password、phpMyAdmin配置AllowNoPassword/nopassword/password三项均为true,且排除validate_password插件拦截。
直接查 mysql.user 表的 authentication_string 字段
空密码不是靠配置开关控制的,而是由 mysql 用户记录本身决定的。关键字段是 authentication_string:只要它的值是空字符串 '' 或 null,该用户就可被空密码登录(前提是认证插件允许)。
登录 MySQL 后执行:
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;
注意:plugin 列也要看——如果值是 auth_socket(Ubuntu/Debian 默认),它根本不校验密码,但 phpMyAdmin 无法兼容这种模式,会静默失败;只有 mysql_native_password 才真正支持“空密码”语义。
AllowNoPassword 配置生效前必须确认的三件事
phpMyAdmin 的 $cfg['Servers'][$i]['AllowNoPassword'] = true 不是万能钥匙,它只放行“已存在且合法的空密码用户”。漏掉任一环节都会导致登录页跳回或报错 #2002 Cannot log in to the MySQL server:
- MySQL 用户的
authentication_string必须为''(不是NULL,也不是'*'占位符) - 该用户的
plugin必须是mysql_native_password(auth_socket或caching_sha2_password均不支持空密码登录) - phpMyAdmin 配置中还需同步设
$cfg['Servers'][$i]['nopassword'] = true和$cfg['Servers'][$i]['password'] = '',只改AllowNoPassword不够
为什么你看到 Login without a password is forbidden by configuration
这个错误明确指向 phpMyAdmin 层面的拦截,说明服务端 MySQL 其实没拒绝——问题出在前端校验。常见原因:
-
config.inc.php里只改了AllowNoPassword,但漏了nopassword和password两项 - 浏览器缓存了旧登录态(特别是 cookie 认证),关掉窗口重开新标签才生效
- 用了
config.default.php而非实际加载的config.inc.php(很多教程误导) - PHP 的
session或cookie权限异常,导致认证参数未传递到后端
检查时最容易被忽略的细节
空密码账户常藏在 host 字段里——比如 root@'127.0.0.1' 和 root@'localhost' 是两个独立用户。你可能清掉了 localhost 的空密码,却忘了 127.0.0.1 或 '%' 上还挂着一个。
另外,validate_password 插件启用后,ALTER USER ... IDENTIFIED BY '' 会直接报错 ERROR 1819 (HY000),此时 authentication_string 就不可能为空,AllowNoPassword 自然失效。这类环境里,所谓“空密码登录”从底层就被堵死了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











