Set authentication on mongoDB

By default mongoDB access is public.
This is my note on setting up authentication, it is referred to mongoDB v 3.0.6 on Windows.

The command line parameter to start the service with authentication is:

--auth

(I’m sorry for all this space for writing two dash and a word but this shit of WordPress make it impossible in other ways)

From the same server you can connect to a database that is started with –auth but just for set up configuration (in older versions you could do more things).
You can create a user with the command db.createUser(…).
If you had just been connected you will receive an error which say you don’t have authorization.
You MUST change the current database to “admin” (use admin).
Now you can create a user, but just only one!

Remember:
1) If you create a user without a password you are fucked.
2) If you create a user in the admin database you are fucked.
3) If you create a user without admin roles you are fucked.

Create that user and give it the “userAdmin” (or userAdminAnyDatabase or dbOwner).
After you have correctly created the user you must reconnect with authentication to create more user and in general to manage roles.
In the current session you cannot do nothing else.
You cannot create, update, delete user neither see users (with show users command).

To connect with authentication use the -u, -p and -authenticationDatabase parameters.

Example:

mongo localhost:27123 -u <username> -p <password> -authenticationDatabase admin

Reference on mongoDB DOCS

 

FAQ

Q. Which permissison and roles are needed for execute show users command?
A.

Primo approccio a mongoDB

Appunti sui problemi e soluzioni nati durante l’esperienza dell’utilizzo di mongoDB.

Windows 7 64 bit
mongoDB versione 2.4.4 (e successivamente 2.4.5)
Driver C# versione 1.8.1
Percorso dei file di mongoDB: C:\mongoDB
Cartella dei database: D:\Databases\mongoDB

2013-06-05

Errore su installazione con percorso personalizzato

Ho seguito alla lettera le istruzioni del tutorial sul sito ufficiale per creare il file di configurazione contenente il path del file di log.
Si presenta un errore riferito al file di configurazione che si è creato: [error per line ‘ |1’] o qualcosa di simile.

Ho risolto seguendo le indicazioni trovate su un articolo in internet, mi pare che abbia dovuto cancellare (l’ho rinominato) il file di configurazione prima di eseguire il comando --install e poi l’ho ricreato (rinominato con il nome originale).
Forse proprio questa operazione è stata la causa del problema riscontrato poi, ovvero il fallimento dell’avvio del servizio “MongoDB”.

2013-06-05

Errore su avvio del servizio “MongoDB”

L’installazione seguendo il tutorial sul sito ufficiale non è riuscita impostando un percorso personalizzato per i database.
Il problema che si presenta è il mancato avvio del servizio “MongoDB”, nel log viene segnalato che non viene trovato il percorso “/data/db” che è il percorso di default per i database.

Ho dovuto usare il comando da console trovato su un articolo in internet per ovviare al problema.
Di fatto il tutorial pur indicando che si può personalizzare il percorso dove verranno salvati i database non dà indicazioni corrette sull’installazione. Nelle FAQ non ho trovato nulla al riguardo.

2013-06-06

Errore “Element ‘_id’ does not match any field or property of class PersonalFinance.Entities.User.

L’errore è dovuto alla mancanza di una proprietà “Id”.


using MongoDB.Bson;
public ObjectId Id { get; set; }

Le mie classi entità si trovano in un apposito progetto, con namespace “Entities”.
Purtroppo essendo usate anche nel progetto di interfaccia (Web site) devo aggiungere la referenza alla libreria a MongoDB.Bson.dll anche in quest’ultimo, e di questo non sono contento.

La proprietà “Id” è anche usata nel metodo Save().

2013-08-05

Nuova installazione su un altro PC

Download del file mongodb-win32-x86_64-2.4.5.zip ed estrazione della cartella bin in S:\mongoDB.

Inizio l’installazione e quindi eseguo il comando:
mongod.exe--dbpath "d:\Databases\mongoDB"

Tutto sembra andare a buon fine in quanto mi trovo con alcuni file creati nella cartella che conterrà i database ed il prompt che mi informa che il server è in ascolto sulla porta 27017, il “waiting for connections message” menzionato dalla guida.
Con un’altra console dos riesco a interagire con il server.

Passiamo all’installazione del servizio.
Come la guida richiede creo la cartella per i log, S:\mongoDB\log.
Poi creo il file s:\mongoDB\bin\mongod.cfg e ci scrivo:
logpath=S:\mongoDB\log\mongo.log
senza andare a capo a fine linea.

Poi però aggiungo l’opzione per indicare il percorso dei database, quindi su una nuova linea:
dbpath=D:\Databases\mongoDB
e non vado a capo a fine linea.

Ora eseguo il comando per installare il servizio:
mongod.exe --config S:\mongoDB\bin\mongod.cfg --install

Ok, dopo il primo errore “Access is denied (5)” riprovo facendo partire la console DOS con “Run as administrator”.
Servizio installato.
Con il comando net start mongoDB dovrebbe partire…

E invece:

The Mongo DB service could not be started.
A system error has occurred.
System error 1067 has occurred.
The process terminated unexpectedly.

Mi stavo già per arrabbiare, ma poi vedo che in Notepad++ il file mongod.cfg non è salvato.
Lanciando il comando mongo nell’output si legge che sta cercando di accedere alle cartelle /data/db che non vengono trovate.
Uso mongod --remove per rimuovere il servizio e dopo aver salvato il file mongod.cfg ripeto installazione e starto il servizio. Questa volta funziona tutto.

2013-10-26

Unique key

Dovendo associare all’utente loggato nella mia applicazione una valuta ho pensato di creare un’entità “Currency” contenente il nome ed il simbolo della valuta. Non volendo creare Model, View e Controller per inserire 2 valute (euro e dollaro) ho optato per l’altra via: usare la shell. In realtà ho usato un file script (.js) che richiamo con un semplice doppio click. Devo dire che però inserire e semplici recor in una tabella di 3 campi (“Code”, “Name” e “Symbol”) e poi la chiave indice univoco sul campo “Code”, non è stato immediato. Poi ho dovuto collegare ai document “Account” (la mia collection per gli utenti) le “Curency”. Anche qui tramite script.
I simboli (inseriti con il file script) non vengono mostrati, forse dovrei usare la stringa ”\u20ac” per l’euro.
Volevo creare in prima battuta degli oggetti falsi, invece comunque ho dovuto creare l’entità “Currency” e la classe CurrencyRepository che mi legge dal database la Currency. Con un database relazionale avrei creato sul database come indice univoco e chiave primaria il solo campo “Code” e quindi sarebbe stato immediato creare gli oggetti in memoria.

2013-10-26

Oggetti relazionati

Ho ora un problema con gli oggetti relazionati.
Nella documentazione ufficiale si consiglia di usare l’embed per tenere le relazioni tra gli oggetti, in quanto altrimenti necessitano più query per ottenere il dato.
In questo modo però l’aggiornamento dell’oggetto relazionato (di alcune sue proprietà) non si ripercuote in tutti gli oggetti dove è stato inserito. Se invece nell’oggetto iniziale si inserisce solo un campo che serva per relazionare le entità, nel caso di liste dell’oggetto di partenza come si ottengonop gli oggetti relazionati (quello che in SQL sarebbe un inner join)? E nel caso di ulteriori sotto-relazioni?
Se non trovo una soluzione semplice a questo, dovrò passare tutto il progetto che ho basato su mongoDB ad un database relazionale (SQL Server + NHibernate, sono la scelta più probabile).

Alla fine sono passato a SQL Server perché le mie entità sono tutte relazionate e lavorare con Mongo su entità relazionate è un delirio.