Не удается аутентифицироваться в манго, "auth failed"

Я создал пользователя-администратора для Монго, используя следующие инструкции:

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

С клиента Монго, похоже, я могу аутентифицироваться:

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

Но я не могу подключиться другим способом. Например:

mongo -u admin -p SECRETPASSWORD

выдает ошибку:

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 фактически проверяет учетные данные, которые вы предоставляете в коллекции <database>.system.users. Итак, в основном, когда вы пытаетесь подключиться к "test", он ищет учетные данные в test.system.users и возвращает ошибку, потому что не может их найти (так как они хранятся в admin.system.users). Наличие права на чтение и запись со всех БД не означает, что вы можете напрямую подключиться к ним.

Сначала необходимо подключиться к базе данных, содержащей учетные данные. Пытаться:

mongo admin -u admin -p SECRETPASSWORD

Для получения дополнительной информации, проверьте это http://docs.mongodb.org/manual/reference/privilege-documents/

Ответ 2

Я также получил эту ошибку, мне нужно было указать базу данных, в которой хранились данные аутентификации пользователя:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Обновление 18 ноября 2017 г.:

mongo admin -u admin -p

- лучшее решение. Mongo запросит у вас пароль, таким образом, вы не будете вводить пароль в виде открытого текста в историю оболочки, что является просто ужасной практикой безопасности.

Ответ 3

Вам может потребоваться обновить оболочку mongo. У меня была версия 2.4.9 оболочки mongo локально, и я получил эту ошибку, пытающуюся подключиться к базе mongo 3. Обновление версии оболочки до 3 позволило решить проблему.

Ответ 4

Я знаю, это может показаться очевидным, но мне также пришлось использовать одну кавычку вокруг u/n и p/w, прежде чем это сработало

администратор монго -u "пользователь" -p "пароль"

Ответ 5

В MongoDB 3.0 теперь он поддерживает несколько механизмов аутентификации.

  • Задача и ответ MongoDB (SCRAM-SHA-1) - по умолчанию в версии 3.0
  • MongoDB Challenge и Response (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

Теперь подключение к MongoDB 3.0 с пользователями, созданными с помощью SCRAM-SHA-1, необходимо указать базу данных аутентификации (через клиент командной строки mongo) и использовать другие механизмы при использовании драйвера.

$ > mongo -u USER -p PASSWORD --authenticationDatabase admin

В этом случае для аутентификации будет использоваться база данных "admin", которая также является по умолчанию.

Ответ 6

Похоже, что проблема заключается в том, что пользователь, созданный с помощью метода, описанного в документах mongo, не имеет разрешения на подключение к базе данных по умолчанию (тест), даже если этот пользователь был создан с ролями "userAdminAnyDatabase" и "dbAdminAnyDatabase".

Ответ 7

Это устранило мою проблему:

Перейдите в оболочку терминала и введите 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:[email protected]: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);
  });

Ответ 8

Это своего рода конкретный случай, но если кто-нибудь попадет сюда с моей проблемой:

В MongoHQ он покажет вам поле под названием "пароль", но на самом деле это всего лишь хэш пароля. Вам нужно будет добавить нового пользователя и сохранить пароль в другом месте (потому что MongoHQ не покажет его вам).

Ответ 9

Правильный способ входа в оболочку mongo -

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

Ответ 10

Другая возможность: когда вы создали пользователя, вы могли случайно use базу данных, отличную от admin, или ту, которую вы хотели. Вам необходимо установить --authenticationDatabase для базы данных, в которой пользователь был фактически создан.

mongodb видимому, помещает вас в test базу данных по умолчанию при открытии оболочки, поэтому вам нужно будет написать --authenticationDatabase test --authenticationDatabase admin если вы случайно use test при db.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 admin или use desiredDatabaseName. Таким образом, вы можете удалить пользователя с помощью db.dropUser("myusername") а затем создать другого пользователя в нужной базе данных, например:

use desiredDatabaseName
db.createUser(...)

Надеюсь, это поможет кому-то, кто был в моем положении новичка в этом деле.

Ответ 11

Вы также можете попробовать следующее: -

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

Нашел его в этом сообщении

Здесь очевидно, что localhost может быть другим хостом, а /admin может быть другой базой данных, на которой была применена аутентификация

Ответ 12

Проверьте версию клиента mongo, с которой мы подключаемся к серверу mongo.

В моем случае сервер mongo был версии Mongo4.0.0, но мой клиент был версии 2.4.9. Обновите версию Монго, чтобы обновить Монго Cli.