我在EC2上运行了Bitnami MEAN实例。经过大量的讨论,我已经能够使用本地shell成功连接到数据库。我创建了具有访问数据所需的所有权限的经过身份验证的用户,当我运行以下代码时 - 我可以毫无问题地访问数据库。
sudo mongo admin -u <USERNAME-p <PASSWORD>
那就是说,当我尝试使用远程连接重复此操作时,我反复给出一个&#34; auth失败&#34;来自MongoDB的错误。
mongo <HOST>:<PORT>/<DATABASE> -u <USERNAME> -p <PASSWORD>
...
这很奇怪,因为我使用与运行本地shell时完全相同的凭据。唯一的区别是我包括主机和端口信息。我已经确认,如果我在mongodb.config中禁用auth参数,我的远程连接也能正常工作。
mongo <HOST>:<PORT>/<DATABASE>
显然,在制作中我希望能够进行身份验证。你们有没有人建议为什么远程和本地认证之间存在差异?
答案 0 :(得分:24)
我遇到了同样的问题。
对我来说问题是:
我的本地mongo shell是v2.6.10。它使用名为MONGODB-CR that has been deprecated的身份验证方法。
我的服务器版本是v3.0.4。它使用名为SCRAM-SHA-1的身份验证方法。
尝试使用以下命令检查本地shell和远程服务器版本:
mongo --version
mongod --version
如果它们不同,请将本地shell升级到v3。 (我不得不卸载并再次安装它。)
答案 1 :(得分:1)
在服务器和客户端上安装相同的版本为我解决了问题。 正如@Alexandre上面解释的那样,这可能是密码加密的问题。 MongoDB版本3.2.7
我尝试了两种方法:
mongo --host "your_host" --port "your_port" --username "your_user" --password "your_pass" --authenticationDatabase "your_admin_db"
mongo "your_host:your_port/your_db" --username "your_user" --password "your_pass" --authenticationDatabase "your_admin_db"
此外,请确保您的服务器可用于远程访问。在https://docs.mongodb.com/v3.2/reference/configuration-options/
查看有关net.bindIp的详细信息答案 2 :(得分:1)
我以前安装了MongoDB 3.2.12版,并且能够使用以下方法连接到远程实例
mongo -u ‘<USERNAME>’ -p ‘<PASSWORD>’ --host <REPLICA_SET>/<HOST>:<PORT> admin
我正在创建一个版本为3.4.2的新集群,但无法使用相同的命令进行连接。在尝试了许多不同的选项后,我终于弄清楚我需要在admin数据库之前添加--authenticationDatabase。
mongo -u ‘<USERNAME>’ -p ‘<PASSWORD>’ --host <REPLICA_SET>/<HOST>:<PORT> --authenticationDatabase admin
答案 3 :(得分:1)
如果您使用的是MongoDB的最新版本(在我的情况下是服务器版本4.2.6 / shell版本v3.6.9),则不必像@Alexandre的示例中那样强制它们匹配。例如,如果您遇到此错误:
[thread1] Error: Authentication failed. :
DB.prototype._authOrThrow@src/mongo/shell/db.js:1608:20
您可以使用以下语法进行连接:
mongo --host mongodb://username:password@IP:PORT/ --authenticationDatabase admin
答案 4 :(得分:0)
这主要是出于安全原因。
当您可以访问本地环境时,很容易认为您是系统管理员或开发人员,因为您可以访问本机。
如果您无法访问本地计算机,则无法保证这一点,并且由于数据库安全性非常重要(在大多数情况下),因此不启用远程访问是有意义的。当然,您可以禁用此功能,但不建议这样做。
希望我帮助过。
答案 5 :(得分:0)
如果有人遇到同样的问题,只有在另一个数据库中创建用户时才需要authenticationDatabase。如果在连接的数据库中创建用户,则没有问题。
所以要小心:使用然后创建用户。
如果您碰巧在admin数据库中创建了用户,那么您需要authenticationDatabase标志。