109

我使用以下说明为 mongo 创建了一个管理员用户:

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

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

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

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

mongo -u admin -p 密码

给出错误:

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

auth = trueetc/mongod.conf.

我错过了什么?

4

13 回答 13

124

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

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

mongo admin -u admin -p SECRETPASSWORD

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

于 2013-12-28T00:05:15.440 回答
88

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

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

2017 年 11 月 18 日更新:

mongo admin -u admin -p

是一个更好的解决方案。Mongo 会提示您输入密码,这样您就不会将明文密码放入 shell 历史记录中,这只是一种糟糕的安全做法。

于 2014-04-21T18:33:12.403 回答
41

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

于 2015-06-12T15:56:19.907 回答
35

我知道这可能看起来很明显,但我还必须在 u/n 和 p/w 周围使用单引号,然后才能工作

mongo admin -u '用户' -p '密码'

于 2014-05-06T19:24:46.273 回答
22

在 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 密码 --authenticationDatabase 管理员

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

于 2015-10-07T16:54:47.683 回答
18

这解决了我的问题:

转到终端外壳并键入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);
  });
于 2017-06-28T10:54:15.347 回答
14

问题似乎是通过 mongo 文档描述的方法创建的用户无权连接到默认数据库(测试),即使该用户是使用“userAdminAnyDatabase”和“dbAdminAnyDatabase”角色创建的。

于 2013-08-14T14:28:31.843 回答
4

另一种可能性:当您创建用户时,您可能不小心访问了use一个数据库admin,而不是您想要的数据库。您需要设置--authenticationDatabase为实际创建用户的数据库。

mongodb当您打开shell时,似乎test默认将您放入数据库中,因此您需要编写--authenticationDatabase test而不是--authenticationDatabase admin在运行.usetestdb.createUser(...)

假设您可以访问运行 mongodb 实例的机器,您可以禁用授权/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(...)

希望这可以帮助那些在我这个菜鸟位置上的人。

于 2018-08-31T10:47:22.343 回答
2

这是一种特殊情况,但如果有人遇到我的问题:

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

于 2014-09-09T01:59:36.097 回答
2

登录 mongo shell 的正确方法是

mongo localhost:27017 -u 'uuuuu' -p '>xxxxxx' --authenticationDatabase dbname

于 2017-06-06T12:24:33.397 回答
1

你也可以试试这个:-

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

在这篇文章中找到它

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

于 2017-11-01T15:15:21.187 回答
0
mongo admin -u root -p root

mongorestore -u root  --authenticationDatabase admin --db rtp_new mongo
于 2021-08-03T15:00:59.107 回答
0

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

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

于 2019-06-25T11:47:14.043 回答