Не удается пройти аутентификацию в mongo, «ошибка аутентификации»


91

Я создал пользователя-администратора для 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 = trueв etc/mongod.conf.

Что мне не хватает?


1
Может быть, Mongo настроен на прием соединений только от localhost? По крайней мере, это случилось со мной, когда я использовал наш производственный экземпляр mongodb при попытке получить к нему доступ с моего компьютера.
Akku

Я так не думаю, я получаю это сообщение об ошибке при подключении с той же машины, что и mongod. Кроме того, он позволяет мне подключаться без указания имени пользователя и пароля, а затем указания имени пользователя и пароля с помощью db.auth (мой первый пример).
Justkevin

PS: db.changeUserPassword("admin", "password")изменить пароль для каждой базы данных.
laggingreflex

Ответы:


105

Аутентификация управляется на уровне базы данных. Когда вы пытаетесь подключиться к системе с помощью базы данных, mongo фактически проверяет учетные данные, которые вы предоставляете в коллекции <database>.system.users. Итак, в основном, когда вы пытаетесь подключиться к «тесту», он ищет учетные данные test.system.usersи возвращает ошибку, потому что не может их найти (поскольку они хранятся в admin.system.users). Право читать и писать из всех баз данных не означает, что вы можете напрямую подключаться к ним.

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

mongo admin -u admin -p SECRETPASSWORD

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


4
как также упоминается ниже, в другом ответе (но я пропустил его, так как я смотрел только на самые популярные), мне нужно было добавить одинарные кавычки вокруг имени пользователя и пароля, прежде чем я
смогу

Да, если вы используете двойные кавычки, идиотский bash, возможно, сделает всевозможные гадости.
moodboom

73

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

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

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

mongo admin -u admin -p

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


2
Да, этот ответ работает! В сочетании с ответом @gilo у меня работает следующая команда: «mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin»
Цун-Тинг Куо

38

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


7
Как указано в документе: версии оболочки mongo до 3.0 несовместимы с развертываниями MongoDB 3.0, которые обеспечивают контроль доступа. Если у вас есть развертывание 3.0 MongoDB, для которого требуется контроль доступа, вы должны использовать версию 3.0 оболочки mongo.
Finch_Powers,

33

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

mongo admin -u 'пользователь' -p 'пароль'


2
Я наткнулся на ваш ответ, потому что mongo -u <myuser> -p <mypasswdне работал. Почему adminздесь разница?
blz

2
он говорит Монго использовать администратора базы данных. если вы создадите другую базу данных и назначите пользователя этой базе данных, тогда это будет mongo <another_database> -u user -p password
Afriyandi Setiawan

Огромное спасибо. Это действительно странно, я не использовал кавычки и двойные кавычки, это не сработало. Это так глупо.
ржавый

20

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

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - по умолчанию в версии 3.0
  2. MongoDB Challenge and 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 ПОЛЬЗОВАТЕЛЬ -p ПАРОЛЬ --authenticationDatabase admin

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


Это изменение в поведении важно, так как оно сбило меня с толку при смешивании новой версии MongoDB и старой версии pymongo. Вам необходимо убедиться, что ваш экземпляр mongo и все клиенты mongo обновлены.
i_grok

Это был мой случай: 1. Изменил mongo-java-driver-2.12.3.jar на mongo-java-driver-3.2.2.jar 2. Изменил MongoCredential.createMongoCRCredential на MongoCredential.createCredential
nikolai.serdiuk

тьфу. насколько сложно разработчикам дать нам лучшую ошибку, такую ​​как "недопустимый метод аутентификации"
Байрон Уитлок

15

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

Перейдите в оболочку терминала и введите 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

13

Она возникает проблема заключается в том , что пользователь , созданный с помощью метода , описанного в Монго документации , не имеет разрешения на подключение к базе данных по умолчанию (тест), даже если пользователь был создан с «userAdminAnyDatabase» и ролями «dbAdminAnyDatabase».


есть такая же проблема. Они могут быть способом использовать админскую базу данных по умолчанию вместо теста
Идан Шехтер

3

Другая возможность: при создании пользователя вы могли случайно 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(...)

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


2

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

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


2

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

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase имя базы данных


1

Вы также можете попробовать это: -

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

Нашел в этом посте

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.