J'ai activé l'authentification dans le fichier de configuration MongoDB après avoir ajouté un utilisateur administrateur avec les privilèges suivants: userAdmin
et userAdminAnyDatabase
.
Maintenant, je me connecte avec cet utilisateur à la base de données où cet utilisateur administrateur est défini (sinon je reçois exception: login failed
).
Après avoir réussi à me connecter, je veux ajouter un nouvel utilisateur à une nouvelle base de données. Pour cela j'essaye:
use another
db.addUser(...)
mais je reçois une erreur:
Wed Dec 11 17:45:18.277 couldn't add user: not authorized for insert on app.system.users at src/mongo/Shell/db.js:128
Comment puis-je créer une nouvelle base de données et y ajouter un premier utilisateur?
Détaillé (tous les utilisateurs ont 1234 comme mot de passe dans cet exemple)
$ mongo mono -u admin_all -p 1234
MongoDB Shell version: 2.4.6
connecting to: mono
> db.system.users.find()
{ "_id" : ObjectId("52a9831de41eb640bb0f5f64"), "user" : "admin_all", "pwd" : "a6316ed4886c10663cce46bc216ea375", "roles" : [ "userAdmin", "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("52a98404ef1f9bc934b62e11"), "user" : "admin_one", "pwd" : "884f516cf308a4c6a75bbc5a0a00807b", "roles" : [ "userAdmin" ] }
{ "_id" : ObjectId("52a98415ef1f9bc934b62e12"), "user" : "admin_any", "pwd" : "1616611df9b47c58b607054d384cab99", "roles" : [ "userAdminAnyDatabase" ] }
> use another
switched to db another
> db.addUser({ user: "user", pwd: "1234", roles: ["read"] })
{
"user" : "user",
"pwd" : "461d4f349d8d4ec3d22a4c945010c330",
"roles" : [
"read"
],
"_id" : ObjectId("52a985372fcdbfd033003a7e")
}
Thu Dec 12 10:43:19.091 couldn't add user: not authorized for insert on another.system.users at src/mongo/Shell/db.js:128
L'erreur commise était que j'utilisais un utilisateur userAdminAnyDatabase
qui était [~ # ~] pas [~ # ~] dans le admin base de données (voir cette note ). Il y a donc [~ # ~] doit [~ # ~] être une base de données appelée admin sur votre serveur! Comme le dit la documentation pour les privilèges "AnyDatabase":
Si vous ajoutez l'un de ces rôles à un document de privilège utilisateur en dehors de la base de données d'administration, le privilège n'aura aucun effet.
Vous devez donc:
ajouter un userAdminAnyDatabase
à la admin
db
$ mongo admin
> db.createUser({ user: "myadmin", pwd: "1234", roles: ["userAdminAnyDatabase"] })
activer l'authentification
auth = true
setParameter = enableLocalhostAuthBypass=0
connectez-vous en utilisant le nouvel utilisateur myadmin
à la base de données de votre choix et ajoutez d'autres utilisateurs:
$ mongo another -u myadmin -p 1234
> db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
ou
> use another
> db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
C'est ce qui a fonctionné pour moi pour créer un utilisateur prod
qui se connecte à la base de données prod
en supposant que j'avais un utilisateur administrateur (appelé admin
) déjà dans MongoDB:
> mongo admin --username root --password <pwd>
> use prod
> db.createUser(
{
user: "prod",
pwd: "<pwd>",
roles: [ { role: "dbOwner", db: "prod" } ]
}
)
> exit
Après cela, vous pouvez vous connecter avec le nouvel utilisateur prod
comme ceci:
> mongo prod --username prod --password <pwd>