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

时间:2018-05-17 09:28:59

标签: java mysql eclipse maven spring-boot

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

  

在java.sql.SQLException:无法加载身份验证插件   ' caching_sha2_password&#39 ;. at at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:868)at at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:864)at at   com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1746)     at at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)at at at   com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2191)     at at   com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2222)     at 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)     at at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native   方法)在   sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)     at at   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知   来自)java.lang.reflect.Constructor.newInstance(未知   来自com.mysql.jdbc.Util.handleNewInstance(Util.java:425)     at at   com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)at at     在   com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)     at at at java.sql.DriverManager.getConnection(Unknown Source)at at   java中的java.sql.DriverManager.getConnection(未知来源)   ch.qos.logback.core.db.DriverManagerConnectionSource.getConnection(DriverManagerConnectionSource.java:54)     at at   ch.qos.logback.core.db.ConnectionSourceBase.discoverConnectionProperties(ConnectionSourceBase.java:46)     at at   ch.qos.logback.core.db.DriverManagerConnectionSource.start(DriverManagerConnectionSource.java:38)     at at   ch.qos.logback.core.joran.action.NestedComplexPropertyIA.end(NestedComplexPropertyIA.java:161)     at at   ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)     at at   ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)     at at   ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)     at at   ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)     at at   ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)     at at   ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)     at at   ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)     at at   ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)     at at   ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)     at at   ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)     at at   org.slf4j.impl.StaticLoggerBinder.init(staticLoggerBinder.java:84)at     在   org.slf4j.impl.StaticLoggerBinder。(StaticLoggerBinder.java:55)     at atg.slf4j.LoggerFactory.bind(LoggerFactory.java:150)at at at   org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)     at at   org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)at     在   ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addStatus(StatusViaSLF4JLoggerFactory.java:32)     at at   ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addInfo(StatusViaSLF4JLoggerFactory.java:20)     at at   ch.qos.logback.classic.servlet.LogbackServletContainerInitializer.onStartup(LogbackServletContainerInitializer.java:32)     at at   org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245)     at at   org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)     at at   org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1421)     at at   org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1411)     at at java.util.concurrent.FutureTask.run(Unknown Source)at at   java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)at     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)     at at java.lang.Thread.run(Unknown Source)

17 个答案:

答案 0 :(得分:85)

  

从MySQL 8.0.4开始,他们更改了默认值   MySQL服务器的身份验证插件,从 mysql_native_password 到   的 caching_sha2_password

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

示例用户名/密码=>学生/ pass123

ALTER USER 'student'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123';

有关详细信息,请参阅官方页面:MySQL Reference Manual

答案 1 :(得分:70)

其他人已经指出了根本问题,但是在我的情况下,我使用的是dbeaver,最初与dbeaver建立mysql连接时选择的是错误的mysql驱动程序(此处的答案为https://github.com/dbeaver/dbeaver/issues/4691#issuecomment-442173584

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


For this error selecting the top mysql 4+ choice in this figure will give the error mentioned in this quesiton


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


enter image description here

答案 2 :(得分:19)

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

使用相同mysql版本的连接器

答案 3 :(得分:10)

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

答案 4 :(得分:10)

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

答案 5 :(得分:6)

我正在使用mysql 8.0.12,并将mysql连接器更新为mysql-connector-java-8.0.12。

希望对您有所帮助。

答案 6 :(得分:6)

使用您的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>

此后我的问题已解决。

答案 7 :(得分:5)

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

可以在here中找到Java连接器的Maven存储库。
如果您使用flyway插件,还应该考虑使用updating it, too

然后,您只需使用以下命令即可更新 maven pom

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

或者对于使用 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')
    }
 }

All that you really need to do (build.gradle example)

答案 8 :(得分:4)

以上提到的内容:

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

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

{{1}}

答案 9 :(得分:2)

您遇到“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';

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

ALTER USER your_user_name IDENTIFIED WITH mysql_native_password;

答案 10 :(得分:2)

在处理来自this Murach JSP book的现成项目时,我在NetBeans上遇到了这个问题。该问题是由于将5.1.23 Connector J与MySQL 8.0.13数据库一起使用引起的。我需要用新驱动程序替换旧驱动程序。下载连接器J后,这需要三个步骤。

如何替换NetBeans项目连接器J:

  1. here下载当前的连接器J。然后将其复制到您的操作系统中。

  2. 在NetBeans中,单击“项目”选项卡旁边的“文件”选项卡。找到mysql-connector-java-5.1.23.jar或任何旧的连接器。删除此旧的连接器。粘贴到新的连接器中。

  3. 单击“项目”选项卡。导航到“库”文件夹。删除旧的mysql连接器。右键单击“库”文件夹。选择添加罐子/文件夹。导航到放置新连接器的位置,然后选择打开。

  4. 在“项目”选项卡中,右键单击该项目。在弹出菜单的底部选择“解析数据源”。单击添加连接。此时,NetBeans会向前跳过,并假定您要使用旧的连接器。单击上一步按钮返回到跳过的窗口。卸下旧的连接器,然后添加新的连接器。单击“下一步”,然后单击“测试连接”以确保其正常工作。

作为视频参考,我发现this很有用。对于IntelliJ IDEA,我发现this很有用。

答案 11 :(得分:2)

我认为最好更新您的“ mysql-connector” lib软件包,这样数据库可以更加安全。

我正在使用8.0.12版的mysql。当我将mysql-connector-java更新到8.0.11版本时,问题消失了。

答案 12 :(得分:1)

如果可以将连接器更新为支持MySQL 8的新身份验证插件的版本,请执行此操作。如果由于某种原因不能选择该选项,请将数据库用户的默认身份验证方法更改为本机。

答案 13 :(得分:0)

如果添加了多个版本的连接器jar文件,则删除connect .jar文件,仅添加与sql版本匹配的连接器jar文件。

答案 14 :(得分:0)

另一个原因可能是您指向错误的端口。

确保您实际上指向的是正确的SQL Server。您可能已在3306上运行了MySQL的默认安装,但实际上可能需要其他MySQL实例。

检查端口并针对数据库运行一些查询。

答案 15 :(得分:0)

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>

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

答案 16 :(得分:0)

我也有这个令人困惑的错误。最终我发现这与 mysql java 连接器版本无关,错误实际上是我设置了错误的数据源用户名(此配置:spring.datasource.druid.username)。

  1. 冲刺启动错误信息是:
create connection error, 
url: jdbc:mysql://..amazonaws.com:3306/moe_grooming?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false, errorCode 0, state null

3624 java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password

我的环境:

  1. MySQL Server 8.0.22
  2. mysql java 连接器版本
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <version>5.1.44</version>
</dependency>
  1. 该用户使用的密码插件是mysql_native_password