用户 'root'@'localhost' 被拒绝访问 (使用密码: YES)

5

我希望连接本地MYSQL数据库,该数据库是与XAMP服务器一起安装的。我创建了一个新用户,即“NewUser”,其密码为“password”。我将所有权限都授予该用户。

我编写了连接数据的代码,使用的是用户“root”(该用户没有密码)。它已连接。就像下面这样。

return DriverManager.getConnection("jdbc:MySql://localhost/database_name","root","");

现在我编写了连接到同一数据库的代码,使用另一个用户“NewUser”及其密码“password”。
return DriverManager.getConnection("jdbc:MySql://localhost/database_name","NewUser","password");

但它没有连接。 控制台中的错误为

java.sql.SQLException: Access denied for user 'NewUser'@'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.GeneratedConstructorAccessor207.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    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 org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.createConnection(JDBCConnection.java:214)
    at org.eclipse.datatools.connectivity.DriverConnectionBase.internalCreateConnection(DriverConnectionBase.java:105)
    at org.eclipse.datatools.connectivity.DriverConnectionBase.open(DriverConnectionBase.java:54)
    at org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.open(JDBCConnection.java:73)
    at org.eclipse.datatools.enablement.internal.mysql.connection.JDBCMySQLConnectionFactory.createConnection(JDBCMySQLConnectionFactory.java:28)
    at org.eclipse.datatools.connectivity.internal.ConnectionFactoryProvider.createConnection(ConnectionFactoryProvider.java:83)
    at org.eclipse.datatools.connectivity.internal.ConnectionProfile.createConnection(ConnectionProfile.java:359)
    at org.eclipse.datatools.connectivity.ui.PingJob.createTestConnection(PingJob.java:76)
    at org.eclipse.datatools.connectivity.ui.PingJob.run(PingJob.java:59)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

在为这个用户提供权限时,我指定了主机类型,例如“任何主机”,即“%”。

如果我将其更改为“localhost”或“127.0.0.1”,它就可以工作。

那么,我如何使用“任何主机”特权与特定用户“NewUser”一起使用我的数据库呢?

如果我在这里成功了,那么我就能够成功连接客户端实时数据库。

感谢大家,请帮我解决这个问题。


你能否使用 mysql -u NewUser -h localhost -p 命令从控制台连接? - Sal00m
5个回答

1

由于第一个指定的代码能够正常工作,并且基于报告的跟踪,我相当确定问题出在数据库上,而不是代码语法上。

根据Mysql版本,请尝试按照Mysql文档中所述,使用不指定任何主机(%)的权限设置作为替代方法,

简单形式的 user_name 是 user_name@'%' 的同义词

此外,在使用 FLUSH PRIVILEGES; 后立即刷新权限。

为了确保一切正确,请运行 SHOW GRANTS FOR NewUser; 并检查NewUser是否以及对应的权限出现在列表中。


0
请尝试使用以下语法。
return DriverManager.getConnection("jdbc:mysql://localhost/database_name?user=NewUser&password=your_password_here");

(只需将你的密码替换为“your_password_here”)

编辑 - 第二次猜测: 有可能是因为阻止了192.168.x.x范围的连接,你把自己防火墙了。

我假设你在用Windows系统。打开命令提示符,输入“ipconfig”,按回车键。看看你的IPv4地址(应该是类似于192.168.1.x的形式)。

确保你的防病毒/防火墙程序允许来自192.168.1.x(也就是你自己)的连接,然后尝试使用那个地址代替“%”或“localhost”。

如果这样还不行,关闭所有防火墙/杀毒软件,然后再试一次。

另外,尝试重新加载权限,可以通过以下任一方式:

  • 重启XAMPP
  • FLUSH PRIVILEGES;

谢谢,但仍然出现相同的错误...“Access denied for user "@ Sharky" - Ramesh J

0

前往用户/权限/编辑权限/更改密码或选择不设置密码,在Hibernate配置文件中更新密码并重新启动服务器。


0
  1. 您的URL应全部小写 -- `jdbc:mysql://localhost/database_name`
  2. 您的数据库真的叫做database_name吗?

他说连接字符串对于root有效,那其他用户的问题为什么会出现在这里呢? - Andres L
嗯,我给定的数据库名称是“database_name”,URL 也正确。如果它不正确,那么第一次也会失败,但是现在没有。 - Ramesh J
2
用户是否已在mysql中创建,并且该用户是否具有访问localhost上的database_name的权限? - hd1
"NewUser" 在 "database_name" 数据库上有权限吗? - Sharky
是的,“NewUser”在这个“database_name”数据库上拥有所有权限。@Sharky - Ramesh J

0
为了让用户访问您的数据库,您需要指定一个主机,他们应该被允许连接。但请注意:即使您使用通配符(%)作为主机名,用户也无法从本地主机连接。他们可以从任何主机连接,但不能从本地主机连接。当从本地主机连接时,我假设您的mysql安装认为您是匿名用户。为了允许用户从本地主机连接,您需要添加一个在主机字段中带有“localhost”的单独用户。
有关更多详细信息,请参阅MySQL文档
其中两个账户的用户名为monty,密码为some_pass。这两个账户都是超级用户账户,具有完全的权限可以执行任何操作。'monty'@'localhost'账户只能在本地主机连接时使用。'monty'@'%'账户使用'%'通配符作为主机部分,因此可以从任何主机连接。
必须拥有这两个账户才能让monty从任何地方以monty身份连接。如果没有localhost账户,则mysql_install_db创建的localhost匿名用户账户将在monty从本地主机连接时优先使用。结果,monty将被视为匿名用户。原因是匿名用户账户的Host列值比'monty'@'%'账户更具体,因此在用户表排序中排在前面。(用户表排序在“访问控制,阶段1:连接验证”一节中讨论。)

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