2013-05-13 91 views
21

舉例來說,如果我有這樣的用戶:如何更改MongoDB用戶權限?

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

而且我想給該用戶的TestDB數據庫的dbAdmin權限,我可以刪除然後用戶記錄與新的權限添加回去:

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

但是,這似乎hacky和容易出錯。

我可以更新表記錄本身:

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

但我不知道,如果真的產生正確的權限 - 它看起來不錯,但它可能是微妙的錯誤。

有沒有更好的方法來做到這一點?

回答

7

請參閱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" 
     ] 
    }, 
} 

更新

的MongoDB檢查每個訪問權限。如果您看到運營商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; 
    } 
} 

您會看到 - 操作員更改了用戶的文檔。

system.users Privilege DocumentsDelegated Credentials for MongoDB Authentication

+0

MongoDB權限檢查器是從數據庫中讀取每個訪問還是緩存? – 2013-07-15 15:10:37

+0

每次訪問。在答案中查看更新部分。 – 2013-07-16 15:45:39

+5

不錯的答案,它錯過了一小段: db.system.users.update({「user」:「testAdmin」},{$ addToSet:{'otherDBRoles.TestDB':'dbAdmin'}},false,假)(使用db.system.users而不是db.users) – 2013-10-22 20:54:20

3

看到,如果你想只更新用戶的角色。您可以通過以下方式執行:

db.updateUser("userName", 
       { 

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

注意: - 這將只覆蓋該用戶的角色。

+0

updateUser不是一個函數,只接受{「user」:「userName」},字符串不夠 – benek 2017-02-06 16:30:10