Impossibile eseguire l'autenticazione in mongo, "autenticazione non riuscita"


90

Ho creato un utente amministratore per mongo usando queste indicazioni:

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

Dal client mongo sembra che io possa autenticare:

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

Ma non riesco a connettermi in nessun altro modo. Per esempio:

mongo -u admin -p PASSWORD SEGRETA

dà l'errore:

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

Ho auth = truedentro etc/mongod.conf.

Cosa mi sto perdendo?


1
Forse Mongo è configurato per accettare solo connessioni da localhost? Almeno questo è successo a me utilizzando la nostra istanza mongodb di produzione quando ho provato ad accedervi dal mio computer.
Akku

Non credo, ricevo quel messaggio di errore quando mi connetto dalla stessa macchina di mongod. Inoltre, mi consente di connettermi senza fornire un nome utente / password e quindi fornire un nome utente / password con db.auth (il mio primo esempio).
justkevin

PS: db.changeUserPassword("admin", "password")per cambiare la password per ogni database.
laggingreflex

Risposte:


100

L'autenticazione è gestita a livello di database. Quando provi a connetterti al sistema utilizzando un database, mongo controlla effettivamente le credenziali fornite nella raccolta <database>.system.users. Quindi, fondamentalmente quando si tenta di connettersi a "test", cerca le credenziali in test.system.userse restituisce un errore perché non riesce a trovarle (poiché sono memorizzate in admin.system.users). Avere il diritto di leggere e scrivere da tutti i db non significa che puoi collegarti direttamente a loro.

Devi prima connetterti al database che contiene le credenziali. Provare:

mongo admin -u admin -p SECRETPASSWORD

Per maggiori informazioni, controlla questo http://docs.mongodb.org/manual/reference/privilege-documents/


4
come accennato anche di seguito, in un'altra risposta (ma mi è sfuggito, dato che ho guardato solo quelli più votati) avevo bisogno di aggiungere virgolette singole attorno a nome utente e password, prima di poter accedere
gsaslis

Sì, se usi le virgolette doppie, bash idiota probabilmente farà tutti i tipi di cose brutte.
moodboom

73

Ho anche ricevuto questo errore, ciò di cui avevo bisogno era specificare il database in cui erano memorizzati i dati di autenticazione dell'utente:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Aggiornamento del 18 novembre 2017:

mongo admin -u admin -p

è una soluzione migliore. Mongo ti chiederà la tua password, in questo modo non inserirai la tua password in chiaro nella cronologia della shell che è solo una terribile pratica di sicurezza.


2
Sì, questa risposta funziona! Combinando questo con la risposta di @gilo, il seguente comando funziona per me: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Potrebbe essere necessario aggiornare il guscio del mongo. Avevo la versione 2.4.9 della shell mongo localmente e ho ricevuto questo errore cercando di connettermi a un database di mongo 3. L'aggiornamento della versione della shell alla 3 ha risolto il problema.


7
Come affermato nel documento: le versioni della mongo shell prima della 3.0 non sono compatibili con le distribuzioni 3.0 di MongoDB che impongono il controllo dell'accesso. Se disponi di una distribuzione MongoDB 3.0 che richiede il controllo dell'accesso, devi utilizzare le versioni 3.0 della shell mongo.
Finch_Powers

32

So che questo può sembrare ovvio, ma ho anche dovuto usare una virgoletta singola attorno a u / ne p / w prima che funzionasse

mongo admin -u 'utente' -p 'password'


2
Sono incappato nella tua risposta perché mongo -u <myuser> -p <mypasswdnon funzionava. Perché fa la admindifferenza, qui?
blz

2
dice a mongo di usare l'amministratore del database. se crei un altro database e assegni l'utente a quel database, sarà mongo <another_database> -u user -p password
Afriyandi Setiawan

Grazie mille. Questo è davvero strano, stavo usando senza virgolette e virgolette doppie non funzionava. È così stupido.
arrugginito

20

In MongoDB 3.0, ora supporta più meccanismi di autenticazione.

  1. MongoDB Challenge and Response (SCRAM-SHA-1): impostazione predefinita in 3.0
  2. MongoDB Challenge and Response (MONGODB-CR) - impostazione predefinita precedente (<3.0)

Se avessi iniziato con un nuovo database 3.0 con nuovi utenti creati, sarebbero stati creati utilizzando SCRAM-SHA-1.

Quindi avrai bisogno di un driver in grado di eseguire tale autenticazione:

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

Se avessi aggiornato un database da 2.x con i dati utente esistenti, continuerebbero a utilizzare MONGODB-CR e il database di autenticazione utente dovrebbe essere aggiornato:

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

Ora, la connessione a MongoDB 3.0 con gli utenti creati con SCRAM-SHA-1 è necessaria per specificare il database di autenticazione (tramite il client mongo della riga di comando) e utilizzando altri meccanismi se si utilizza un driver.

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

In questo caso, per l'autenticazione verrà utilizzato il database "admin", che è anche quello predefinito.


Questo cambiamento nel comportamento è importante, poiché mi ha fatto inciampare quando misi una nuova versione di MongoDB e una vecchia versione di pymongo. Devi assicurarti che la tua istanza mongo e tutti i client mongo siano aggiornati.
i_grok

Questo era il mio caso: 1. Modificato mongo-java-driver-2.12.3.jar in mongo-java-driver-3.2.2.jar 2. Modificato MongoCredential.createMongoCRCredential in MongoCredential.createCredential
nikolai.serdiuk

ugh. quanto sarebbe difficile per gli sviluppatori darci un errore migliore come "metodo di autenticazione non valido"
Byron Whitlock,

13

Esso appare il problema è che un utente creato tramite il metodo descritto nella documentazione mongo non dispone dell'autorizzazione per la connessione al database predefinito (test), anche se l'utente è stato creato con la "userAdminAnyDatabase" e ruoli "dbAdminAnyDatabase".


hanno lo stesso problema. Il loro potrebbe essere un modo per utilizzare il database di amministrazione come predefinito invece del test
Idan Shechter,

13

Questo ha risolto il mio problema:

Vai alla shell del terminale e digita mongo.

Quindi digita use db_name.

Quindi digita:

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

Prova anche: db.getUsers()

Campione veloce:

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
Per aggiungere: 1. Accedi prima al database admin con mongodb superadmin: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Quindi passa al database di destinazione: > use targetDb 3. Quindi aggiungi l'utente> db.createUser(...)
daniel.widyanto

3

Un'altra possibilità: quando hai creato l'utente, potresti aver accidentalmente useinserito un database diverso admino diverso da quello che volevi. È necessario impostare --authenticationDatabaseil database in cui l'utente è stato effettivamente creato.

mongodbsembra mettere nel testdatabase di default quando si apre la shell, così avresti bisogno di scrivere --authenticationDatabase testpiuttosto che --authenticationDatabase adminse accidentalmente erano useIng testdurante l'esecuzione db.createUser(...).

Supponendo che tu abbia accesso alla macchina su cui è in esecuzione l'istanza mongodb, potresti disabilitare l'autorizzazione in /etc/mongod.conf(commentare authorizationche è annidato sotto sicurezza), quindi riavviare il server, quindi eseguire:

mongo
show users

E potresti ottenere qualcosa del genere:

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

Notare che il dbvalore è uguale a test. Questo perché quando ho creato l'utente, non ho eseguito prima use admino use desiredDatabaseName. Quindi puoi eliminare l'utente con db.dropUser("myusername")e quindi creare un altro utente nel database desiderato in questo modo:

use desiredDatabaseName
db.createUser(...)

Spero che questo aiuti qualcuno che era nella mia posizione di noob con questa roba.


3

A differenza di MYSQl e della maggior parte degli RDBMS, MongoDB ha una configurazione diversa.

Non viene fornito con l'utente di autenticazione di base integrato già configurato. È necessario configurare manualmente. Devi andare su Mongo.conf e abilitare l'autorizzazione, abilitalo con cautela se non lo fai genererà un errore nell'avvio della tua istanza di mongo. Quindi controlla se il tuo server mongo è stato avviato o meno.

Il passaggio successivo è Abilita autorizzazione in Mongo come utente: -

Dobbiamo creare un utente con accesso root e modificare la configurazione di mongo auth.

Passa ad Admin DB: -

use admin

Crea utente con privilegio di root: -

 db.createUser({user:"admin",
                     pwd:"admin",
                    roles:[{role:"root",
                             db:"admin"
                            }] });

Cambia il tuo mongo.conf in Abilita autorizzazione: -

security:
    authorization: "enabled"

Segui questa guida passo passo per configurare l' autenticazione in MongoDB.


2

Questo è un caso specifico, ma nel caso qualcuno arrivi qui con il mio problema:

In MongoHQ, ti mostrerà un campo chiamato "password", ma in realtà è solo l'hash della password. Dovrai aggiungere un nuovo utente e memorizzare la password altrove (perché MongoHQ non te la mostrerà).


2

Il modo corretto per accedere a mongo shell è

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


1

Puoi anche provare questo: -

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

L'ho trovato in questo post

Qui ovviamente il localhost può essere un altro host e / admin può essere un altro database su cui è stata applicata l'autenticazione


0

Controlla la versione mongo del client da cui ci stiamo connettendo al server mongo.

Nel mio caso, il server mongo era della versione Mongo4.0.0 ma il mio client era della versione 2.4.9. Aggiorna la versione mongo per aggiornare mongo cli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.