2013-05-13 5 views
21

Zum Beispiel, wenn ich diesen Benutzer:Wie ändern Sie MongoDB Benutzerberechtigungen?

> db.system.users.find() 
{ "user" : "testAdmin", "pwd" : "[some hash]", "roles" : [ "clusterAdmin" ], "otherDBRoles" : { "TestDB" : [ "readWrite" ] } } 

Und ich möchte, dass Benutzer auf der TestDB Datenbank die dbAdmin Berechtigungen geben, kann ich den Benutzerdatensatz entfernen Sie dann mit den neuen Berechtigungen hinzufügen zurück:

> db.system.users.remove({"user":"testAdmin"}) 
> db.addUser({ user: "testAdmin", 
        pwd: "[whatever]", 
        roles: [ "clusterAdmin" ], 
        otherDBRoles: { TestDB: [ "readWrite", "dbAdmin" ] } }) 

Aber das scheint hacky und fehleranfällig.

Und ich kann die Tabelle Datensatz aktualisiert selbst:

> db.system.users.update({"user":"testAdmin"}, {$set:{ otherDBRoles: { TestDB: [ "readWrite", "dbAdmin" ] }}}) 

Aber ich bin nicht sicher, ob das wirklich die richtigen Berechtigungen schafft - es sieht gut aus, aber es kann auf subtile Weise falsch sein.

Gibt es einen besseren Weg, dies zu tun?

Antwort

7

Siehe array update operators.

> db.users.findOne() 
{ 
    "_id" : ObjectId("51e3e2e16a847147f7ccdf7d"), 
    "user" : "testAdmin", 
    "pwd" : "[some hash]", 
    "roles" : [ 
     "clusterAdmin" 
    ], 
    "otherDBRoles" : { 
     "TestDB" : [ 
      "readWrite" 
     ] 
    } 
} 
> db.users.update({"user" : "testAdmin"}, {$addToSet: {'otherDBRoles.TestDB': 'dbAdmin'}}, false, false) 
> db.users.findOne() 
{ 
    "_id" : ObjectId("51e3e2e16a847147f7ccdf7d"), 
    "user" : "testAdmin" 
    "pwd" : "[some hash]", 
    "roles" : [ 
     "clusterAdmin" 
    ], 
    "otherDBRoles" : { 
     "TestDB" : [ 
      "readWrite", 
      "dbAdmin" 
     ] 
    }, 
} 

aktualisieren:

MongoDB prüft Erlaubnis bei jedem Zugriff. Wenn Sie Betreiber sehen db.changeUserPassword:

> db.changeUserPassword 
function (username, password) { 
    var hashedPassword = _hashPassword(username, password); 
    db.system.users.update({user : username, userSource : null}, {$set : {pwd : hashedPassword}}); 
    var err = db.getLastError(); 
    if (err) { 
     throw "Changing password failed: " + err; 
    } 
} 

Sie werden sehen - Operator ändert Benutzerdokument.

Siehe auch system.users Privilege Documents und Delegated Credentials for MongoDB Authentication

+0

Liest der MongoDB-Berechtigungsüberprüfer bei jedem Zugriff aus der Datenbank oder wird er zwischengespeichert? –

+0

Bei jedem Zugriff. Siehe Aktualisierungsteil in Antwort. –

+5

Schöne Antwort, es fehlt jedoch ein kleines Stück: db.system.users.update ({"user": "testAdmin"}, {$ addToSet: {'andereDBRoles.TestDB': 'dbAdmin'}}, false, false) (Verwenden Sie db.system.users not db.users) –

3

Wenn Sie gerade Rolle der Benutzer aktualisieren möchten. Sie können folgendermaßen vorgehen:

db.updateUser("userName", 
       { 

       roles : [ 
          { role : "dbAdmin", db : "dbName" }, 
          { role : "readWrite", db : "dbName" } 
         ] 
       } 
      ) 

Hinweis: - Dies überschreibt nur Rollen für diesen Benutzer.

+0

updateUser ist keine Funktion und nur {"user": "userName"} wird akzeptiert, String ist nicht genug – benek