无法验证到mongo,“验证失败”


90

我已经按照以下说明为mongo创建了管理员用户:

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

从mongo客户端看来,我可以进行身份​​验证:

> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>

但是我无法以其他任何方式连接。例如:

mongo -u管理员-p密码

给出错误:

JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228

auth = true进去了etc/mongod.conf

我想念什么?


1
也许Mongo配置为仅接受来自localhost的连接?尝试从我的计算机访问它时,至少使用我的生产mongodb实例发生了这种情况。
2013年

我不这么认为,当从与mongod所在的同一台计算机进行连接时,会收到该错误消息。另外,它使我可以在不提供用户名/密码的情况下进行连接,然后再提供带有db.auth的用户名/密码(我的第一个示例)。
justkevin 2013年

PS:db.changeUserPassword("admin", "password")更改每个数据库的密码。
laggingreflex 2015年

Answers:


100

身份验证在数据库级别进行管理。当您尝试使用数据库连接到系统时,mongo实际上会检查您在collection中提供的凭据<database>.system.users。因此,基本上,当您尝试连接“测试”时,它将在中查找凭据test.system.users并返回错误,因为它找不到它们(因为它们存储在中admin.system.users)。拥有从所有数据库读取和写入的权利并不意味着您可以直接连接到它们。

您必须先连接到拥有凭据的数据库。尝试:

mongo admin -u admin -p SECRETPASSWORD

有关更多信息,请查看此http://docs.mongodb.org/manual/reference/privilege-documents/


4
如下所述,在另一个答案中(但我错过了,因为我只看了投票率最高的那个),我需要在用户名和密码周围加上单引号,然后才能登录
gsaslis

是的,如果您使用双引号,那么愚蠢的bash可能会做各种令人讨厌的事情。
moodboom

73

我也收到此错误,我需要指定存储用户身份验证数据的数据库:

mongo -u管理员-p SECRETPASSWORD --authentication数据库管理员

2017年11月18日更新:

mongo admin -u admin -p

是更好的解决方案。Mongo会提示您输入密码,这样您就不会将明文密码输入外壳历史记录,这只是可怕的安全做法。


2
是的,这个答案有效!将其与@gilo的答案结合使用,以下命令对我有用:“ mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin”
Tsung-Ting Kuo

38

您可能需要升级mongo shell。我在本地安装了2.4.9版的mongo shell,尝试连接到mongo 3数据库时出现此错误。将shell版本升级到3可解决该问题。


7
如doc中所述:3.0之前的mongo shell版本与实施访问控制的MongoDB 3.0部署不兼容。如果您有需要访问控制的3.0 MongoDB部署,则必须使用3.0版本的mongo Shell。
Finch_Powers 2015年

32

我知道这似乎很明显,但是在工作之前,我还必须在u / n和p / w周围使用单引号

mongo管理员-u'用户'-p'密码'


2
我偶然发现了您的答案,因为mongo -u <myuser> -p <mypasswd它没有用。为什么admin在这里有所作为?
blz 2015年

2
它告诉mongo使用数据库管理员。如果您创建另一个数据库,并将用户分配给该数据库,则它将为mongo <another_database> -u user -p password
Afriyandi Setiawan

非常感谢。这真的很奇怪,我没有使用引号和双引号,但是没有用。太傻了
生锈的

20

在MongoDB 3.0中,它现在支持多种身份验证机制。

  1. MongoDB质询和响应(SCRAM-SHA-1)-3.0中的默认值
  2. MongoDB质询和响应(MONGODB-CR)-先前的默认值(<3.0)

如果从创建新用户的新3.0数据库开始,则应该使用SCRAM-SHA-1创建它们。

因此,您将需要具有该身份验证功能的驱动程序:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

如果您使用现有用户数据从2.x升级数据库,那么他们仍将使用MONGODB-CR,并且用户身份验证数据库必须升级:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

现在,需要使用SCRAM-SHA-1创建的用户连接到MongoDB 3.0,以指定身份验证数据库(通过命令行mongo客户端),并在使用驱动程序时使用其他机制。

$> mongo -u用户-p密码--authentication数据库管理员

在这种情况下,还将使用“ admin”数据库(也是默认数据库)进行身份验证。


这种行为上的变化很重要,因为在将新版本的MongoDB和旧版本的pymongo混合使用时,它使我感到震惊。您需要确保您的mongo实例和所有mongo客户端都是最新的。
i_grok '16

这是我的情况:1.将mongo-java-driver-2.12.3.jar更改为mongo-java-driver-3.2.2.jar 2.将MongoCredential.createMongoCRCredential更改为MongoCredential.createCredential
nikolai.serdiuk

啊。开发人员为我们提供更好的错误(如“无效的身份验证方法”)将有多难?
Byron Whitlock,

13

出现的问题是,通过在蒙戈文档中描述的方法创建的用户没有权限连接到默认数据库(测试),即使该用户是用“userAdminAnyDatabase”和“dbAdminAnyDatabase”角色创建。


有同样的问题。他们可能是使用管理数据库默认而不是测试的方法
Idan Shechter 2014年

13

这解决了我的问题:

转到终端外壳并键入 mongo

然后输入use db_name

然后输入:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

也可以尝试: db.getUsers()

快速样本:

const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options

// Use Connect Method to connect to the Server
MongoClient.connect(url)
  .then((db) => {
    console.log(db);
    console.log('Casually connected correctly to server.');
    // Be careful with db.close() when working asynchronously
    db.close();
  })
  .catch((error) => {
    console.log(error);
  });

2
补充:1。登录到管理数据库MongoDB的与第一超级管理员:mongo 'mongodb://localhost:27017/admin' -u admin -p 2.然后切换到目标数据库:> use targetDb 3.然后添加用户> db.createUser(...)
daniel.widyanto

3

另一种可能性:创建用户时,您可能不小心正在use使用admin,或所需数据库以外的数据库。您需要设置--authenticationDatabase用户实际在其下创建的数据库。

mongodb似乎在test打开外壳时默认情况下会将您放入数据库中,因此您需要编写--authenticationDatabase test而不是在运行时--authenticationDatabase admin意外use输入testdb.createUser(...)

假设您可以访问运行mongodb实例的计算机,则y可以禁用授权/etc/mongod.conf(注释掉authorization嵌套在安全性下),然后重新启动服务器,然后运行:

mongo
show users

而且您可能会得到像这样的东西:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

请注意,该db值等于test。这是因为创建用户时,我并没有先运行use adminuse desiredDatabaseName。因此,您可以使用删除用户,db.dropUser("myusername")然后在所需的数据库下创建另一个用户,如下所示:

use desiredDatabaseName
db.createUser(...)

希望这可以帮助那些处于我作为菜鸟的位置的人使用这些东西。


3

与MYSQl和大多数RDBMS不同,MongoDB具有不同的设置。

它没有内置的基本auth用户已经设置好的。您需要手动设置。您需要转到Mongo.conf并启用授权,请谨慎启用它,否则将在启动mongo实例时引发错误。然后,您检查mongo服务器是否已启动。

下一步是在Mongo中以用户身份启用授权:-

我们需要创建一个具有root用户访问权限的用户,并更改mongo auth config。

切换到管理数据库:

use admin

创建具有根特权的用户:

 db.createUser({user:"admin",
                     pwd:"admin",
                    roles:[{role:"root",
                             db:"admin"
                            }] });

更改您的mongo.conf以启用授权:-

security:
    authorization: "enabled"

请按照此逐步指南进行操作,以了解MongoDB中的设置身份验证。


2

这是一种特定的情况,但万一有人到我这里来解决我的问题:

在MongoHQ中,它将向您显示一个名为“密码”的字段,但实际上它只是密码的哈希值。您必须添加一个新用户并将密码存储在其他位置(因为MongoHQ不会向您显示密码)。


2

登录mongo shell的正确方法是

mongo本地主机:27017 -u'uuuuu'-p'> xxxxxx'--authentication数据库dbname


1

您也可以尝试:

mongo localhost:27017/admin -u admin -p SECRETPASSWORD

发现于 这篇文章中

在这里,显然localhost可以是其他主机,而/ admin可以是已应用身份验证的其他数据库


0

从我们连接到mongo服务器的位置检查客户端的mongo版本。

我的情况是mongo服务器的版本为Mongo4.0.0,但我的客户端的版本为2.4.9。更新mongo版本以更新mongo cli。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.