【发布时间】:2016-01-01 23:06:14
【问题描述】:
我在连接到公共托管的静态 IP mysql 服务器时遇到了一个奇怪的问题。
我可以使用 MySQL Workbench 成功连接到服务器,也可以通过 SSH 连接到本地远程服务器。但是,从 jdbc 连接器连接到 mysql 服务器的尝试(通过 NetBeans 和通过本地部署的代码都失败)。在查看日志时,考虑到用户凭据是本地用户而不是远程用户,代码正在尝试与远程服务器连接。所以用户存在于远程但java在尝试连接时会考虑user@localhost。确切的错误显示为:
原因:java.sql.SQLException:用户访问被拒绝 'user'@'c-24-130-52-20.hsd1.ca.comcast.net'(使用密码:YES) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1750) ~[mysql-connector-java-5.1.27.jar:na]
我的连接字符串是:
jdbc:mysql://user:password@W.X.Y.Z/
有人可以建议如何提及用户,以便 java 认为它是远程用户而不是我机器上的本地用户吗?
【问题讨论】:
-
我认为错误中的地址表示您的机器,而不是它尝试连接的机器。 “用户”之后的标识符是标识谁在尝试连接。您确定所有远程计算机都允许连接到该服务器吗?
-
哦,是的,你是对的。我一开始不明白这一点真是太愚蠢了。感谢您指出。是的,我通过将 bindaddress 设置为 0.0.0.0 来确保每个人都可以从外部进行远程访问。我将编辑问题以消除这种紧凑的愚蠢混乱。谢谢。
-
但是现在我很好奇如何在连接字符串中提及远程机器的本地用户?我假设默认情况下,用户将被视为远程服务器上的用户,例如 user@w.x.y.z,而不是当前方式。我的宽带上没有静态 IP,因此在远程服务器上授予本地用户访问权限也不起作用。
-
不只是监听地址。 MySQL 中的用户权限基于他们连接的用户名和主机,因此 jack@example.com 与 jack@foo.bar.com 不同。请参阅 MySQL 文档中的 privilege system。
-
我认为这里的关键是从所有 IP 向该用户授予权限。见this question。