2013-05-13 84 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