Не вдається автентифікуватися в mongo, “автентифікація не вдається”


91

Я створив користувача адміністратора для mongo, використовуючи ці вказівки:

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 налаштовано приймати лише з'єднання з localhost? Це, принаймні, трапилося зі мною за допомогою нашого виробничого екземпляра mongodb при спробі отримати до нього доступ із мого комп'ютера.
Акку

Я не думаю, що я отримую це повідомлення про помилку при підключенні з тієї ж машини, що і 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"
Tsung-Ting Kuo

38

Можливо, вам доведеться оновити оболонку монго. У мене була версія 2.4.9 оболонки mongo локально, і я отримав цю помилку при спробі підключитися до бази даних mongo 3. Оновлення версії оболонки до 3 вирішило проблему.


7
Як зазначено у документі: Версії оболонки mongo до 3.0 не сумісні з розгортаннями 3.0 MongoDB, які забезпечують контроль доступу. Якщо у вас є розгортання 3.0 MongoDB, яке вимагає контролю доступу, ви повинні використовувати 3.0 версії оболонки mongo.
Finch_Powers

33

Я знаю, що це може здатися очевидним, але мені також довелося використовувати одну цитату навколо u / n та p / w, перш ніж це спрацювало

mongo admin -u 'user' -p 'password'


2
Я натрапив на вашу відповідь, бо mongo -u <myuser> -p <mypasswdне працював. Чому тут adminщось змінюється ?
blz

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

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

$> mongo -u КОРИСТУВАЧ -p ПАРОЛЬ --authenticationDatabase 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 superadmin: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Потім перейдіть до цільової бази даних: > use targetDb 3. Потім додайте користувача> db.createUser(...)
daniel.widyanto

13

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


мають те саме питання. Вони можуть бути способом використовувати адміністратор db за замовчуванням замість тесту
Айдан Шехтер,

3

Інша можливість: Коли ви створювали користувача, можливо, ви випадково ввели useбазу даних admin, відмінну від тієї, яку ви бажали. Вам потрібно встановити --authenticationDatabaseбазу даних, в якій користувач насправді був створений.

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

use desiredDatabaseName
db.createUser(...)

Будемо сподіватися, що це допоможе комусь, хто був на моєму місці як нуб із цим матеріалом.


2

Це свого роду конкретний випадок, але на випадок, якщо хтось потрапить сюди з моєю проблемою:

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


2

Правильним способом входу в оболонку mongo є

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDabase 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.