JDBC连接:即使所有Previlleges都被授予,用户也被拒绝访问[关闭]

Posted

技术标签:

【中文标题】JDBC连接:即使所有Previlleges都被授予,用户也被拒绝访问[关闭]【英文标题】:JDBC Connection: Access Denied for User even All Previlleges are Granted [closed] 【发布时间】:2013-07-16 19:53:04 【问题描述】:

我有一个通过此代码连接到数据库的 JApplet:

    String url = "jdbc:mysql://localhost:3306/moodlele_survey";
    String user = "moodlele_garanti";
    String password = "garanti";



    try 
        panel.add( new JLabel("before driver"));
        Class.forName("com.mysql.jdbc.Driver");
        panel.add( new JLabel("failed"));
        Connection con = DriverManager.getConnection(url, user, password);

小程序已签名,因此它有权连接数据库。数据库用户被授予所有 previlleges 并且用户名、密码和数据库名称是正确的,因为我可以使用相同的信息通过 php 连接到数据库。我该如何解决?

打印的堆栈错误是: 用户 'moodlele_garanti'@'localhost' 的访问被拒绝(使用密码:YES)

【问题讨论】:

为什么这被否决了? 您确定您的数据库、用户和密码使用了正确的文本吗? 我得到的建议是将 url 更改为 www.mywebsite.com:3306 但这会带来错误问题是 Applet 正在下载到客户端,他可以' 不能访问 localhost 中的数据库(可能用户没有安装 mysql 数据库)。如何解决这个问题?嗯…… 在您的代码中看到“localhost”这个词了吗?那是 local 主机;您的(本地)机器。小程序在浏览器中运行。 @user1570194 问题是PHP在部署应用程序的服务器上执行了服务器PHP代码。您的用户通过 http://someUrl/appName/restOfUrl.php 访问您的 PHP 站点,这意味着 PHP 代码在 someUrl 服务器(或此 someUrl 名称指向的任何地方)执行,并且看起来此服务器已在其中安装 MySQL 数据库,因此没有访问数据库时遇到问题。另一方面,Applet 被下载到客户端 PC,即它将作为桌面应用程序执行,并且您的客户端在其 PC 中没有 mysql 数据库。 【参考方案1】:

您似乎并没有真正掌握您正在使用的技术,或者它们的工作原理。

在您声明的 cmets 中:

我网站的客户端机器也是一个本地主机,用于在其中运行的代码通过 ftp 上传,就像 PHP 中的逻辑一样:编写本地主机并上传到服务器,然后连接

PHP 正在在网络服务器上运行。这也恰好是与您的 mysql 服务器相同的主机。所以,是的 localhost 在 PHP 中是正确的。您家中计算机上的网络浏览器通过 TCP 连接到网络服务器,PHP 在网络服务器上执行,连接到 同一主机 上的 mysql 服务器,一切正常。

Java 小程序在您机器上的浏览器中运行。小程序从网站下载到您家中的机器上,并在该机器上运行。您的代码在您的问题中的编写方式,然后尝试连接到您家中机器上的 mysql 服务器localhost 是你的电脑。

为了让该小程序连接到您托管公司的 mysql 服务器,它需要尝试连接到 那个 主机。此外,端口需要在该服务器上打开/在该服务器上允许远程连接到 mysql 服务器,mysql 需要监听外部(公共)IP 地址上的连接,并且您需要为该用户授予权限能够从远程主机连接。

可能值得一提的是,总的来说,这是一个非常糟糕的主意。 向世界公开数据库很少是一个好主意;授予访问权限的一个小错误会产生一个非常大的问题。还有许多其他安全问题。人们会这样做吗?当然。仍然不是一个好主意。

通常,为公共消费而设计的小程序会使用中介服务(例如 Web API 甚至 RMI),让您有机会锁定事物。

【讨论】:

以上是关于JDBC连接:即使所有Previlleges都被授予,用户也被拒绝访问[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:即使查询的所有字段都被索引,为啥我的扫描对象值很高?

Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上

Tomcat JDBC Conencton Pool + MySQL 会出现“Broken pipe”问题,即使有连接验证

我与数据库的 JDBC 连接是不是使用 SSL?

JDBC访问数据库的步骤

如何通过 JDBC 获取 Oracle 表中的所有索引,即使它们由不同的用户拥有?