Nie można uwierzytelnić w mongo, „uwierzytelnianie nie powiodło się”


91

Utworzyłem administratora dla mongo, korzystając z tych wskazówek:

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

Z klienta mongo wygląda na to, że mogę się uwierzytelnić:

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

Ale nie mogę połączyć się w żaden inny sposób. Na przykład:

mongo -u admin -p SECRETPASSWORD

podaje błąd:

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

Mam auth = truew etc/mongod.conf.

czego mi brakuje?


1
Może Mongo jest skonfigurowane tak, aby akceptować tylko połączenia z lokalnego hosta? Przynajmniej przydarzyło mi się to, gdy próbowałem uzyskać do niej dostęp z mojego komputera, używając naszej produkcyjnej instancji mongodb.
Akku

Nie sądzę, otrzymuję ten komunikat o błędzie podczas łączenia z tego samego komputera co mongod. Ponadto pozwala mi się połączyć bez podawania nazwy użytkownika / hasła, a następnie podać nazwę użytkownika / hasło za pomocą db.auth (mój pierwszy przykład).
justkevin

PS: db.changeUserPassword("admin", "password")aby zmienić hasło dla każdej bazy danych.
laggingreflex

Odpowiedzi:


105

Uwierzytelnianie jest zarządzane na poziomie bazy danych. Kiedy próbujesz połączyć się z systemem za pomocą bazy danych, mongo faktycznie sprawdza poświadczenia, które podajesz w kolekcji <database>.system.users. Tak więc, w zasadzie, gdy próbujesz połączyć się z „testem”, szuka poświadczeń w test.system.usersi zwraca błąd, ponieważ nie może ich znaleźć (ponieważ są one przechowywane admin.system.users). Posiadanie prawa do odczytu i zapisu ze wszystkich baz danych nie oznacza, że ​​możesz się z nimi bezpośrednio łączyć.

Musisz najpierw połączyć się z bazą danych przechowującą poświadczenia. Próbować:

mongo admin -u admin -p SECRETPASSWORD

Więcej informacji można znaleźć na http://docs.mongodb.org/manual/reference/privilege-documents/


4
jak wspomniano poniżej, w innej odpowiedzi (ale przegapiłem ją, ponieważ patrzyłem tylko na te z najwyższymi głosowaniami), musiałem dodać pojedyncze cudzysłowy wokół nazwy użytkownika i hasła, zanim mogłem się zalogować
gsaslis

Tak, jeśli użyjesz podwójnych cudzysłowów, idiotyczny bash prawdopodobnie zrobi różne nieprzyjemne rzeczy.
moodboom

73

Otrzymałem również ten błąd, potrzebowałem tylko wskazać bazę danych, w której przechowywane są dane uwierzytelniające użytkownika:

mongo -u admin -p SECRETPASSWORD --authentication Administrator bazy danych

Aktualizacja z 18 listopada 2017 r .:

mongo admin -u admin -p

to lepsze rozwiązanie. Mongo poprosi Cię o podanie hasła, w ten sposób nie umieścisz hasła w postaci zwykłego tekstu w historii powłoki, co jest po prostu okropną praktyką bezpieczeństwa.


2
Tak, ta odpowiedź działa! W połączeniu z odpowiedzią z @gilo, działa dla mnie następujące polecenie: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Może zajść potrzeba ulepszenia powłoki mongo. Miałem lokalnie wersję 2.4.9 powłoki mongo i otrzymałem ten błąd podczas próby połączenia się z bazą danych mongo 3. Aktualizacja wersji powłoki do 3 rozwiązała problem.


7
Jak stwierdzono w dokumencie: wersje powłoki mongo wcześniejsze niż 3.0 nie są zgodne z wdrożeniami 3.0 MongoDB, które wymuszają kontrolę dostępu. Jeśli masz wdrożenie 3.0 MongoDB, które wymaga kontroli dostępu, musisz użyć wersji 3.0 powłoki Mongo.
Finch_Powers

33

Wiem, że może się to wydawać oczywiste, ale musiałem też użyć pojedynczego cytatu wokół U / N i P / W, zanim zadziałało

mongo admin -u 'użytkownik' -p 'hasło'


2
Natknąłem się na twoją odpowiedź, ponieważ mongo -u <myuser> -p <mypasswdnie działała. Dlaczego ma adminto znaczenie?
blz

2
mówi mongo, aby używał administratora bazy danych. jeśli utworzysz kolejną bazę danych i przypiszesz użytkownika do tej bazy danych, będzie to mongo <
inna_

Dziękuję bardzo. To naprawdę dziwne, nie używałem cudzysłowów i podwójnych cudzysłowów, ale nie działało. To takie głupie.
zardzewiały

20

W MongoDB 3.0 obsługuje teraz wiele mechanizmów uwierzytelniania.

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - domyślnie w 3.0
  2. MongoDB Challenge and Response (MONGODB-CR) - poprzedni domyślny (<3.0)

Jeśli zacząłeś od nowej bazy danych 3.0 z utworzonymi nowymi użytkownikami, zostaliby oni utworzeni za pomocą SCRAM-SHA-1.

Będziesz więc potrzebował sterownika zdolnego do tego uwierzytelnienia:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

Gdybyś miał zaktualizowaną bazę danych z wersji 2.x z istniejącymi danymi użytkownika, nadal używałaby MONGODB-CR, a baza danych uwierzytelniania użytkowników musiałaby zostać zaktualizowana:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

Teraz łączenie się z MongoDB 3.0 z użytkownikami utworzonymi za pomocą SCRAM-SHA-1 jest wymagane do określenia bazy danych uwierzytelniania (za pośrednictwem klienta mongo z wiersza poleceń) i użycia innych mechanizmów, jeśli używasz sterownika.

$> mongo -u UŻYTKOWNIK -p HASŁO --authentication Administrator bazy danych

W tym przypadku do uwierzytelnienia zostanie użyta baza danych „admin”, która jest również domyślną.


Ta zmiana w zachowaniu jest ważna, ponieważ zaskoczyła mnie podczas miksowania nowej wersji MongoDB i starej wersji pymongo. Musisz upewnić się, że instancja mongo i wszyscy klienci mongo są aktualne.
i_grok

Tak było w moim przypadku: 1. Zmieniono mongo-java-driver-2.12.3.jar na mongo-java-driver-3.2.2.jar 2. Zmieniono MongoCredential.createMongoCRCredential na MongoCredential.createCredential
nikolai.serdiuk

ugh. jak trudno byłoby programistom podać nam lepszy błąd, taki jak „nieprawidłowa metoda uwierzytelniania”
Byron Whitlock,

15

To rozwiązało mój problem:

Przejdź do powłoki terminala i wpisz mongo.

Następnie wpisz use db_name.

Następnie wpisz:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

Spróbuj także: db.getUsers()

Szybka próbka:

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
Aby dodać: 1. Zaloguj się najpierw do bazy danych administratora za pomocą mongodb superadmin: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Następnie przejdź do docelowej bazy danych: > use targetDb 3. Następnie dodaj użytkownika> db.createUser(...)
daniel.widyanto

13

Wydaje się, że problem polega na tym, że użytkownik utworzony metodą opisaną w dokumentacji mongo nie ma uprawnień do łączenia się z domyślną bazą danych (test), nawet jeśli został utworzony z rolami „userAdminAnyDatabase” i „dbAdminAnyDatabase”.


mają ten sam problem. Może to być sposób na użycie bazy danych administratora jako domyślnego zamiast testu
Idan Shechter

3

Inna możliwość: podczas tworzenia użytkownika mogłeś przypadkowo korzystać usez bazy danych innej adminlub innej niż ta, którą chciałeś. Musisz ustawić --authenticationDatabasebazę danych, w której użytkownik został faktycznie utworzony.

mongodbWydaje się, można umieścić w testbazie danych domyślnie po otwarciu powłoki, więc trzeba by napisać --authenticationDatabase testzamiast --authenticationDatabase adminjeśli przypadkowo zostały useing testpodczas uruchamiania db.createUser(...).

Zakładając, że masz dostęp do maszyny, na której działa instancja mongodb, możesz wyłączyć autoryzację /etc/mongod.conf( wykomentować, authorizationktóra jest zagnieżdżona w zabezpieczeniach), a następnie zrestartować serwer, a następnie uruchomić:

mongo
show users

Możesz otrzymać coś takiego:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

Zwróć uwagę, że dbwartość jest równa test. Dzieje się tak, ponieważ kiedy utworzyłem użytkownika, nie uruchomiłem najpierw use adminani use desiredDatabaseName. Możesz więc usunąć użytkownika za pomocą, db.dropUser("myusername")a następnie utworzyć innego użytkownika w wybranej bazie danych, na przykład:

use desiredDatabaseName
db.createUser(...)

Mam nadzieję, że pomoże to komuś, kto był na moim stanowisku nooba w tych sprawach.


2

To jest specyficzny przypadek, ale na wypadek, gdyby ktoś znalazł się tutaj z moim problemem:

W MongoHQ wyświetli pole o nazwie „hasło”, ale w rzeczywistości jest to tylko skrót hasła. Będziesz musiał dodać nowego użytkownika i przechowywać hasło w innym miejscu (ponieważ MongoHQ ci go nie pokaże).


2

Właściwy sposób logowania się do powłoki mongo to

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authentication Nazwa bazy danych bazy danych


1

Możesz także spróbować tego: -

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

Znalazłem to w tym poście

Tutaj oczywiście hostem lokalnym może być inny host, a / admin może być inną bazą danych, na której zastosowano uwierzytelnianie


0

Sprawdź wersję klienta mongo, z którego łączymy się z serwerem mongo.

W moim przypadku serwer mongo miał wersję Mongo 4.0.0, ale mój klient miał wersję 2.4.9. Zaktualizuj wersję mongo, aby zaktualizować mongo cli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.