2013-05-13 22 views
21

Na przykład, jeśli mam tego użytkownika:Jak zmienić uprawnienia użytkownika MongoDB?

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

I chcę dać, że user dbAdmin uprawnienia do bazy TestDB mogę usunąć rekord użytkownik następnie włożyć go z powrotem z nowymi uprawnieniami:

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

Ale to wydaje się być hacky i podatne na błędy.

I mogę zaktualizować rekord tabeli sama:

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

Ale nie jestem pewien, czy to naprawdę tworzy odpowiednie uprawnienia - wygląda w porządku, ale może to być subtelnie źle.

Czy jest lepszy sposób to zrobić?

Odpowiedz

7

Zobacz 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" 
     ] 
    }, 
} 

Aktualizacja:

MongoDB sprawdza uprawnienia na każdym dostępu. Jeśli zobaczysz operację, zobaczysz - operator zmienia dokument użytkownika.

Zobacz także system.users Privilege Documents i Delegated Credentials for MongoDB Authentication

+0

Czy narzędzie sprawdzania uprawnień MongoDB czyta z bazy danych przy każdym dostępie lub jest buforowane? –

+0

Przy każdym dostępie. Zobacz część aktualizacji w odpowiedzi. –

+5

Dobra odpowiedź, brakuje jednak małego kawałka: db.system.users.update ({"user": "testAdmin"}, {$ addToSet: {'otherDBRoles.TestDB': 'dbAdmin'}}, false, false) (użyj db.system.users not db.users) –

3

Jeśli chcesz po prostu zaktualizować Rola Użytkownika. Możesz zrobić w następujący sposób:

db.updateUser("userName", 
       { 

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

Uwaga: - To spowoduje zastąpienie tylko ról dla tego użytkownika.

+0

updateUser nie jest funkcją i tylko {"user": "userName"} jest akceptowane, ciąg nie jest wystarczający – benek

Powiązane problemy