2013-05-13 8 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" ] } }) 

しかし、これはハッキーでエラーが発生しやすいようです。

そして私はテーブルレコード自体を更新することができます。

> 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権限チェッカーは、すべてのアクセス時にデータベースから読み取るのですか、キャッシュされていますか? –

+0

アクセスごとに。回答の更新部分を参照してください。 –

+5

いいえ、答えはありません: db.system.users.update({"user": "testAdmin"}、{$ addToSet:{'otherDBRoles.TestDB': 'dbAdmin'}}、false、 false)(db.system.usersはdb.usersではない) –

3

を参照してください。

注: - これは、そのユーザーのロールのみを上書きします。

+0

updateUserは関数ではなく、{"user": "userName"}のみが受け入れられます。文字列では不十分です – benek

関連する問題