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 = true
w etc/mongod.conf
.
czego mi brakuje?
db.changeUserPassword("admin", "password")
aby zmienić hasło dla każdej bazy danych.Odpowiedzi:
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ń wtest.system.users
i zwraca błąd, ponieważ nie może ich znaleźć (ponieważ są one przechowywaneadmin.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ć:
Więcej informacji można znaleźć na http://docs.mongodb.org/manual/reference/privilege-documents/
źródło
Otrzymałem również ten błąd, potrzebowałem tylko wskazać bazę danych, w której przechowywane są dane uwierzytelniające użytkownika:
Aktualizacja z 18 listopada 2017 r .:
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.
źródło
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.
źródło
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
źródło
mongo -u <myuser> -p <mypasswd
nie działała. Dlaczego maadmin
to znaczenie?W MongoDB 3.0 obsługuje teraz wiele mechanizmów uwierzytelniania.
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ą.
źródło
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()
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); });
źródło
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(...)
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”.
źródło
Inna możliwość: podczas tworzenia użytkownika mogłeś przypadkowo korzystać
use
z bazy danych innejadmin
lub innej niż ta, którą chciałeś. Musisz ustawić--authenticationDatabase
bazę danych, w której użytkownik został faktycznie utworzony.mongodb
Wydaje się, można umieścić wtest
bazie danych domyślnie po otwarciu powłoki, więc trzeba by napisać--authenticationDatabase test
zamiast--authenticationDatabase admin
jeśli przypadkowo zostałyuse
ingtest
podczas uruchamianiadb.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ć,authorization
która jest zagnieżdżona w zabezpieczeniach), a następnie zrestartować serwer, a następnie uruchomić: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
db
wartość jest równatest
. Dzieje się tak, ponieważ kiedy utworzyłem użytkownika, nie uruchomiłem najpierwuse admin
aniuse 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:Mam nadzieję, że pomoże to komuś, kto był na moim stanowisku nooba w tych sprawach.
źródło
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).
źródło
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
źródło
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
źródło
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.
źródło