如何解决无法加载身份验证插件'caching_sha2_password'的问题

Sar*_*han 62 java mysql eclipse maven spring-boot

在eclipse中,当我开始我的应用程序时,我得到了这个 - 无法发现要使用的方言.java.sql.SQLException:无法加载身份验证插件'caching_sha2_password'.

在java.sql.SQLException:无法加载身份验证插件'caching_sha2_password'.在在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:868)处com.mysql.jdbc.SQLError.createSQLException(SQLError.java:864)处com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(了MysqlIO. java:1746)at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2191)at com.mysql.jdbc.ConnectionImpl. connectOneTryOnly(ConnectionImpl.java:2222)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2017)at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:779)at com.mysql.jdbc .JDBC4Connection(JDBC4Connection.java:47)维持在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)维持在sun.reflect.NativeConstructorAccessorImpl.newInstance(来源不明)处sun.reflect.DelegatingConstructorAccessorImpl.newInstance(来源不明)在在java.lang.reflect.Constructor.newInstance(未知来源)at at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at a t com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)at at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)at at java.sql.DriverManager.getConnection(Unknown Source)at at at java.sql.DriverManager.getConnection(来源不明)处ch.qos.logback.core.db.DriverManagerConnectionSource.getConnection(DriverManagerConnectionSource.java:54)维持在ch.qos.logback.core.db.ConnectionSourceBase.discoverConnectionProperties(ConnectionSourceBase .java:46)at ch.qos.logback.core.db.DriverManagerConnectionSource.start(DriverManagerConnectionSource.java:38)at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.end(NestedComplexPropertyIA.java:161 )at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)at at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPl)ayer.java:62)处ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)处ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152) at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)位于ch.qos的ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53). logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)处ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)处org.slf4j.impl.StaticLoggerBinder.init( StaticLoggerBinder.java:84)处org.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:55)处org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)处org.slf4j.LoggerFactory.performInitialization(的LoggerFactory .java:124)at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addSta tus(StatusViaSLF4JLoggerFactory.java:32)位于ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addInfo(StatusViaSLF4JLoggerFactory.java:20)at ch.qos.logback.classic.servlet.LogbackServletContainerInitializer.onStartup(LogbackServletContainerInitializer.java: 32)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina. core.ContainerBase $ StartChild.call(ContainerBase.java:1421)at org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1411)at at java.util.concurrent.FutureTask.run(Unknown Source )at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)at at java.lang.Thread.run(Unknown Source)

Gau*_*rav 111

从MySQL 8.0.4开始,他们将MySQL服务器的默认认证插件从mysql_native_password更改caching_sha2_password.

您可以运行以下命令来解决此问题.

示例用户名/密码=> student/pass123

ALTER USER 'student'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123';
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅官方页面:MySQL参考手册

  • 作者应接受正确的+1 (3认同)
  • 尽管这可行,但是最好升级MySQL Connector / J版本(如其他一些答案所建议),因为它允许您使用更安全的sha2_caching身份验证插件。 (3认同)
  • @theonlygusti您需要将MySQL Connector / J至少更新为5.1.46,或者-更好地-更新为8.0.14。 (2认同)

Pau*_*aul 85

其他人指出了根本问题,但在我的情况下,我使用的是 dbeaver 并且最初在设置与 dbeaver 的 mysql 连接时选择了错误的 mysql 驱动程序(请在此处获得答案:https : //github.com/dbeaver/dbeaver/问题/4691#issuecomment-442173584 )

选择下图中的 MySQL 选项将给出所提到的错误,因为驱动程序是 mysql 4+,可以在数据库信息提示中看到。


对于此错误,选择此图中的顶级 mysql 4+ 选项将给出此问题中提到的错误


与其选择 MySQL 驱动程序,不如选择 MySQL 8+ 驱动程序,如下图所示。


在此处输入图片说明

  • `不允许检索公钥` (10认同)
  • 谢谢,这正是我的问题。您是否碰巧收到另一个错误:“不允许公钥检索”? (8认同)
  • 谢谢。这对我帮助很大。对于那些在 DBeaver 中仍然遇到“不允许公共 Ket 检索”错误的人,我找到了一个解决此问题的链接[此处](https://community.atlassian.com/t5/Confluence-questions/MySQL-Public-Key -不允许检索/qaq-p/778956)。 (6认同)
  • 在 DBeaver 最新版本(检查版本 7.3)中,上面两个选项可用为“MySql 5”和“MySql”。你必须选择“MySql”,当你将鼠标悬停在该选项上时,它会显示一条提示,说明适用于 mysql 版本 8+。 (4认同)

小智 21

可能是你使用了错误的mysql_connector.

使用相同mysql版本的连接器


alo*_*lok 15

使用您的mysql版本升级“ mysql-connector” lib软件包,如下所示,我正在使用8.0.13版本,在pom中,我更改了版本:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <version>8.0.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

此后我的问题解决了。

  • 感谢您的有用回答。对于其他人,要查找最新版本,请使用此链接;https://mvnrepository.com/artifact/mysql/mysql-connector-java (2认同)

Gre*_*les 13

我在一个Spring Boot应用程序中遇到此错误,但在另一个应用程序中没有.最后,我发现一个不工作的Spring Boot版本是2.0.0.RELEASE,正在运行的版本是2.0.1.RELEASE.这导致MySQL连接器的差异 - 5.1.45与5.1.46.我更新了在启动时抛出此错误的应用程序的Spring Boot版本,现在它可以工作了.


小智 13

您只需删除旧连接器并下载新版本(mysql-connector-java-5.1.46)


小智 9

我正在使用mysql 8.0.12并将mysql连接器更新为mysql-connector-java-8.0.12为我解决了该问题。

希望它能帮助到别人。


小智 6

我使用下面的依赖项做了完全相同的问题:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我只是更改为 46 版本,一切正常。


小智 5

您在使用“caching_sha2_password”插件附带的新 MySQL 版本时遇到问题,请按照以下命令解决问题。

DROP USER 'your_user_name'@'%';
CREATE USER 'your_user_name'@'%' IDENTIFIED WITH mysql_native_password BY 'your_user_password';
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_user_name'@'%' identified by 'your_user_password';
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下命令来保持您的特权:

ALTER USER your_user_name IDENTIFIED WITH mysql_native_password;
Run Code Online (Sandbox Code Playgroud)


小智 5

如以上提到的那样:

从MySQL 8.0.4开始,MySQL团队将MySQL服务器的默认身份验证插件从mysql_native_password更改为caching_sha2_password。

因此,有三种方法可以解决此问题:

 1. drop USER 'user_name'@'localhost';
    flush privileges;
    CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'user_name';
    GRANT ALL PRIVILEGES ON * . * TO 'user_name'@'localhost';
    ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 
    'user_name';

 2. drop USER 'user_name'@'localhost';
    flush privileges;
    CREATE USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'user_name';
GRANT ALL PRIVILEGES ON * . * TO 'user_name'@'localhost'

 3. If the user is already created, the use the following command:

    ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 
        'user_name';
Run Code Online (Sandbox Code Playgroud)


Kea*_*che 5

这可能是您需要更新的MySQL连接器,因为MySQL8更改了密码的加密-因此旧的连接器不正确地加密了它们。

Java连接器的Maven仓库可以在这里找到。
如果您使用flyway插件,还应该考虑对其进行更新

然后,您可以使用以下命令简单地更新您的maven pom

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

或对于使用Gradle的其他人,您可以使用以下命令更新build.gradle

 buildscript {
    ext {
        ...
    }
    repositories {
        ...
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath('mysql:mysql-connector-java:8.0.11')
    }
 }

Run Code Online (Sandbox Code Playgroud)

您真正需要做的所有工作(build.gradle示例)