【问题标题】:SQLException: Access denied for user 'whatever'@'localhost'SQLException:访问被拒绝用户'whatever'@'localhost'
【发布时间】:2017-03-28 14:14:40
【问题描述】:

凭据正确,数据库名称正确,MySQL 用户设置正确并拥有所有权限,我有 'username'@'%' 和 'username'@'localhost' 的条目,我可以连接到这个用户通过命令行正确,以及通过 mysql 工作台。换句话说,除了我的 java 应用程序无法连接之外,一切都按应有的方式运行并设置为应有的状态。

我做了大约 3 次干净的 MySQL 卸载和安装,重新启动,没有重新启动,尝试以 root 身份通过应用程序登录(通过),但没有成功,尝试以没有密码的用户身份通过​​应用程序登录(同样的错误) 等。

此外,使用完全相同的登录名在 localhost 上运行的 PHP 网站也可以完美运行。

在过去的 3 天里,我一直在检查和重新检查并尝试所有这些,我浏览了所有相关的 SO 问题,我能找到的所有博客和文档,所有这些。

try {
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  conn = DriverManager.getConnection("jdbc:mysql://localhost/correctDBname", "correctUsername", "correctPassword");
} catch(ClassNotFoundException | SQLException ex) {
  Logger.getLogger(SqlConnection.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}

MySQL 驱动程序名称与项目中 NetBeans 的“库”部分中的名称完全相同:MySQL JDBC 驱动程序 - mysql-connector-java-5.1.23-bin.jar

异常全文:

java.sql.SQLException: Access denied for user 'strada'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at eu.storemedia.stradaserver.engine.SqlConnection.<init>(SqlConnection.java:23)
at eu.storemedia.stradaserver.engine.StradaServer.<init>(StradaServer.java:51)
at eu.storemedia.stradaserver.Home.<clinit>(Home.java:31)

【问题讨论】:

  • 至少添加你的问题的例外
  • 你用的是什么版本的MySql驱动?
  • @Robin 对不起,你把它添加到 OP 是对的
  • @RobertoLinares 如果未指定,则驱动程序默认使用端口 3306。
  • 考虑升级驱动,5.1.23是2013年的,最新版本是5.1.41,比如你可能在5.1.27修复了一个bug("JDBC authentication failed when there is乱码中的空字节,因为 com.mysql.jdbc.MysqlIO.doHandshake 在读入乱码的前 8 个字节时只读取到第一个空字节。(Bug #16723048,Bug #62469)" )

标签: java mysql jdbc


【解决方案1】:

我建议您仔细阅读 MySQL 手册中有关连接故障排除部分的每一条建议。

另外,请查看 Connector/J 故障排除页面:

后一页包含这个有用的提示:

注意:除非您添加“host”标志,并使用 localhost 以外的其他内容作为主机,否则无法使用 mysql 命令行客户端测试您的连接。如果您使用特殊的主机名 localhost,mysql 命令行客户端将使用 Unix 域套接字。 如果您正在测试与 localhost 的连接,请改用 127.0.0.1 作为主机名。

这表明...实际上...您可能没有检查 JDBC 驱动程序正在使用的实际连接方法。它可能会对身份验证产生影响。

【讨论】:

  • 感谢您。在命令行上尝试了 mysql --host=127.0.01 --port=3306 -u correctUsername -p 和 mysql --host=localhost --port=3306 -u correctUsername -p 并且都成功连接了。
【解决方案2】:

...原来从 .txt 文件中读取凭据可能很危险,并且以简化的名义从问题中忽略这一事实是错误的。

如果我使用硬编码凭据,登录就可以了。如果我使用从错误创建的 .txt 文件中读取的凭据,则会发生错误。如果我使用从正确创建的 .txt 文件(没有 BOM 的 utf-8)读取的凭据,登录就可以了。

我已经重写了我正在读取凭据的文件以使其正确,所以我找不到任何细节,但基本上 它包含一些使凭据无效的不可见字符(可能是 BOM) .

【讨论】:

    【解决方案3】:

    也许您同时安装了不同版本的mysql,并且您在环境变量中注册了另一个mysql版本。尝试检查您是否有可以卸载的东西。然后,在正确的文件夹中将正确的mysql添加到环境变量中。

    【讨论】:

    • 不,只有单个版本,但环境变量指向错误的文件夹。已修复,将在此处回复其余 cmets 后重新启动并重试
    • 太棒了!请向我们报告您尝试后得到的结果
    【解决方案4】:

    拒绝用户“strada”@“localhost”访问(使用密码:YES)

    例外解释如下:

    1. 'strada' 用户没有足够的权限在 DB 中执行操作。
    2. 'using password: YES'表示-为用户'strada'提供的密码是正确的。

    修复:

    1. 以 root 用户身份登录 DB,为用户“strada”提供 DBA(数据库管理员)特权。
    2. 使用正确的 JDBC 连接字符串重新连接。

    【讨论】:

    • 如果您正确阅读原始问题,您会知道您的“答案”值得一票否决,不幸的是,我没有足够的声誉给您。
    【解决方案5】:
    Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/correctDBname", "correctUsername", "correctPassword");
    

    【讨论】:

    • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of howwhy 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
    • 包括或省略端口号没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2013-07-28
    • 2023-03-20
    • 2021-07-11
    • 2016-04-26
    相关资源
    最近更新 更多