【问题标题】:Cannot authenticate into mongo, "auth fails"无法验证到 mongo,“验证失败”
【发布时间】:2013-08-15 12:27:19
【问题描述】:

我使用以下说明为 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

我在etc/mongod.conf 中有auth = true

我错过了什么?

【问题讨论】:

  • 也许 Mongo 被配置为只接受来自本地主机的连接?尝试从我的计算机访问我们的生产 mongodb 实例时,这至少发生在我身上。
  • 我不这么认为,当我从与 mongod 相同的机器连接时收到该错误消息。此外,它让我无需提供用户名/密码即可连接,然后使用 db.auth 提供用户名/密码(我的第一个示例)。
  • PS: db.changeUserPassword("admin", "password") 更改每个数据库的密码。

标签: mongodb


【解决方案1】:

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

【讨论】:

  • 有同样的问题。他们可能是一种默认使用管理数据库而不是测试的方法
【解决方案2】:

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

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

mongo admin -u admin -p SECRETPASSWORD

欲了解更多信息,请查看http://docs.mongodb.org/manual/reference/privilege-documents/

【讨论】:

  • 正如下面也提到的,在另一个答案中(但我错过了,因为我只查看了票数最高的答案)我需要在用户名和密码周围添加 单引号 ,在我登录之前
  • 是的,如果你使用双引号,愚蠢的 bash 可能会做各种讨厌的事情。
【解决方案3】:

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

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

2017 年 11 月 18 日更新:

mongo admin -u admin -p

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

【讨论】:

  • 是的,这个答案有效!结合@gilo的答案,以下命令对我有用:“mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin”
【解决方案4】:

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

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

【讨论】:

  • 我偶然发现了您的答案,因为mongo -u <myuser> -p <mypasswd 不起作用。为什么admin 在这里有所作为?
  • 它告诉 mongo 使用数据库管理员。如果您创建另一个数据库,并将用户分配给该数据库,那么它将是 mongo -u user -p password
  • 非常感谢。这真的很奇怪,我没有使用引号和双引号它不起作用。太傻了。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 如文档中所述:3.0 之前的 mongo shell 版本与强制访问控制的 MongoDB 3.0 部署不兼容。如果您有需要访问控制的 3.0 MongoDB 部署,则必须使用 3.0 版本的 mongo shell。
    【解决方案7】:

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

    1. MongoDB 挑战和响应 (SCRAM-SHA-1) - 3.0 中的默认值
    2. MongoDB 挑战和响应 (MONGODB-CR) - 以前的默认值 (

    如果您从创建了新用户的新 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 USER -p PASSWORD --authenticationDatabase admin

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

    【讨论】:

    • 这种行为上的改变很重要,因为它在混合新版本的 MongoDB 和旧版本的 pymongo 时让我很吃惊。您需要确保您的 mongo 实例和所有 mongo 客户端都是最新的。
    • 这是我的情况: 1. 将 mongo-java-driver-2.12.3.jar 更改为 mongo-java-driver-3.2.2.jar 2. 将 MongoCredential.createMongoCRCredential 更改为 MongoCredential.createCredential
    • 呃。开发人员要给我们一个更好的错误,比如“无效的身份验证方法”,会有多难
    【解决方案8】:

    登录mongo shell的正确方法是

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

    【讨论】:

      【解决方案9】:

      这解决了我的问题:

      转到终端外壳并输入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);
        });
      

      【讨论】:

      • 添加:1.先用mongodb superadmin登录admin数据库:mongo 'mongodb://localhost:27017/admin' -u admin -p 2.然后切换到目标数据库:> use targetDb 3.然后添加用户> db.createUser(...)
      【解决方案10】:

      你也可以试试这个:-

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

      this post找到它

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

      【讨论】:

        【解决方案11】:

        另一种可能性:当您创建用户时,您可能不小心use 使用了admin 以外的数据库,或者您想要的数据库以外的数据库。您需要将--authenticationDatabase 设置为实际创建用户的数据库。

        mongodb 似乎在您打开 shell 时默认将您放入 test 数据库中,因此您需要写 --authenticationDatabase test 而不是 --authenticationDatabase admin 如果您不小心被 useing test当你运行db.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(...)
        

        希望这可以帮助那些像我一样菜鸟的人。

        【讨论】:

        • 感谢您提醒我标准数据库“test”。这很有帮助,因为 mongodb 在创建第一个用户时关闭了大门。
        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:
          mongo admin -u root -p root
          
          mongorestore -u root  --authenticationDatabase admin --db rtp_new mongo
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-12-09
            • 1970-01-01
            • 2018-05-18
            • 1970-01-01
            • 2012-03-15
            • 2021-03-20
            • 2019-03-12
            • 1970-01-01
            相关资源
            最近更新 更多