PHP mysqli_connect:客户端未知的身份验证方法[caching_sha2_password]

162

我正在使用php的mysqli_connect连接本地MySQL数据库进行登录

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

这是mysql.user表格的图片:

mysql.user table

MySQL服务器ini文件:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

在MySQL服务器ini文件中使用,无法使用user1或user2登录;

错误: mysqli_connect():服务器要求客户端未知的身份验证方法[caching_sha2_password] ...

在MySQL服务器ini文件中使用,可以使用user1登录,但对于user2,出现相同的错误;


如何在mySql服务器上使用登录?


PDO 支持这个吗?我看到其他关于 mysqli 的报告。 - tadman
@黃皓哲发布的答案应该被标记为采纳答案。 - FIL
从终端使用以下命令登录到mysql:mysql -u root -p,然后输入root密码,接着粘贴以下命令:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; - user3512810
对于所有没有从下面的答案中获得帮助的人:当我在我的 .env 文件中将数据库IP地址设置错误时,我也在 Laravel 应用程序中遇到了这个错误消息! - Charles Wood
18个回答

328

5
好的回答。需要注意的是,根据服务器设置,您可能需要每次添加新用户时都进行这样的操作。 - Machavity
4
非常感谢!我一直在寻找一种将新的密码哈希转换为旧的哈希(例如问题中的user2格式转换为user1格式)的方法,而您的回答恰好完成了这项工作。 - Accountant م
19
四天的折腾后,终于让PHP-7.2.9/11与MySQL-8.012兼容了。能不能说服PHP团队在tarball的安装指南中注明这一点?这将在今后一两年内节省成千上万小时的工作时间。 - MountainMan
10
这应该成为可行的解决方案。 - Yohanim
2
切换到本地身份验证基本上意味着您削弱了整体安全性以允许访问。这确实给了您访问权限,但不能被视为长期安全解决方案。正如@Dimmduh指出的那样,您可能会遇到“ERROR 1819(HY000):您的密码不符合当前策略要求”的问题。 - Simon Brown
显示剩余15条评论

96

4
PDO【存在相同的问题】(参见https://dev59.com/QlUM5IYBdhLWcg3wQeiJ) - Machavity
1
@gen 基于这个错误,看起来在7.4.2版本中已经修复了。 - Machavity
8
升级到php7.4确实解决了这个问题。我认为这是最好的方法,而不是像一些答案建议的那样更改身份验证方法为mysql_native_password - ultrasamad
1
我使用Docker(在一个容器中运行Apache+PHP,在另一个容器中运行MySQL),这解决了我的问题。谢谢! - Joan Galmés Riera
1
PHP 7.4.3在这里。必须更改为mysql_native_password才能正常工作。 - RaminS
显示剩余2条评论

44
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

ALTER USER 之后去除引号('),并在 mysql_native_password BY 之后保留引号(')。

对我也起作用。


4
这是我在本地使用WAMP服务器时唯一有效的解决方案 :) - Jodyshop
这似乎解决了我在 Mac 的 Homebrew LAMP 设置中遇到的问题。不过在 Debian 上没有遇到这个问题。 - Magnus
1
对于完全初学者,1)cd /usr/local/mysql/bin 2)./mysql -u root -p 3)输入此帖子中的代码行 - Jason

32

像很多人一样,我也遇到了同样的问题。尽管用户设置为使用mysql_native_password,并且我可以从命令行连接,但我只能通过添加

default-authentication-plugin=mysql_native_password

到[mysqld]部分中,在我的ubuntu 19.10上的安装中,它位于/etc/mysql/mysql.conf.d/mysqld.cnf,才能使mysqli()连接成功。


3
另外,请记住,如果用户在此更改之前已创建,则不起作用。因此,您应该首先在配置中设置默认身份验证,然后再创建用户才能正常工作! - Oleg Popov
1
这在Ubuntu 20.04上与MySQL 8.0和PHP 5.6一起工作。请注意,您必须将表设置为INNODB才能正常工作。 - rubo77
1
在将此添加到配置文件后,我仍然收到相同的错误。 - Igor
这对我在Ubuntu 20.04.6 LTS上起作用(我不得不编辑 /etc/mysql/mysql.cnf 并运行 systemctl restart mysql.service),MySQL版本为8.0.33-0ubuntu0.20.04.4,PHP 5.6,而且我不需要重新创建用户。 - Raffi
你真是救了我一大把时间... 在 Ubuntu 20.04 上更改了 MySQL 原生密码的用户设置后,我不得不在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中添加了这一行,结果非常顺利。谢谢! - undefined

32

如果你在Windows上无法使用caching_sha2_password,可以按照以下步骤操作:

  1. 重新运行MySQL安装程序
  2. 选择MySQL Server(顶部项目)旁边的“重新配置”
  3. 点击“下一步”,直到到达“身份验证方法”
  4. 将“使用强密码加密进行身份验证(推荐)”更改为“使用传统身份验证方法(保留MySQL 5.X兼容性)”
  5. 点击“下一步”
  6. 在Accounts and Roles中输入Root账户密码,并点击“检查”
  7. 点击“下一步”
  8. 不断点击“下一步”,直到到达“应用配置”
  9. 点击“执行”

安装程序会为您进行所有必要的配置更改。


2
经过一年的点赞,我的数据库被黑客攻击了... - Code Tree
2
我怀疑这不是你的数据库被黑客攻击的根本原因。感谢楼主的帖子,它帮助我配置了MySQL,使其能够运行PHP 5.6的遗留应用程序。 - incredimike

21

对我来说有效(PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64位)

编辑文件C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

default_authentication_plugin=mysql_native_password

在Windows上重置MySQL服务,并在MySQL Shell中执行以下操作...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

它可以工作,谢谢...我们必须配置两个东西:mysql配置和修改用户。 - danisupr4

9
我在命令行中运行了以下命令:ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';最后重新启动了本地服务中的MySQL。

2
应该将 'root' @ 'localhost' 替换为 ALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123'; - d1jhoni1b

7
如果您使用的是Mac操作系统,以下是解决方法。这些是经过很多尝试和错误后得出的结论,希望能帮助其他人。
调试:
$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

解决方法: nano /usr/local/etc/my.cnf

添加:default-authentication-plugin=mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

最后运行:brew services restart mysql

需要这个...谢谢! - nykc

5

现在你可以升级到PHP7.4,MySQL将默认使用caching_sha2_password,因此默认的MySQL安装将与mysqli_connect一起工作,无需进行任何配置。


2
不完全正确,在7.4.0和7.4.1版本中存在缺陷。已在7.4.2中修复 - Machavity

4

我在Ubuntu 18.04中尝试了这个方法,这是唯一有效的解决方案:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

完美。我正在测试。其他答案需要重新构建我的整个系统,而目前它只是为了访问一个项目而工作。我认为我需要一个旋转的“热门”(始终更新)服务器来推进。 - Ken Ingram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接