我在MongoDB中创建自定义角色并将其分配给用户时遇到了麻烦。我按照本指南创建了一个与readWrite相同的自定义角色,但是没有dropCollection特权:
https://hackernoon.com/mongodb-createrole-e1ca1346d3bb
这些是我从那篇文章中遵循的说明:
use admin
db.createRole({
role: "readWriteMinusDropRole",
privileges: [
{
resource: { db: "social", collection: ""},
actions: [ "collStats", "dbHash", "dbStats", "find", "killCursors", "listIndexes", "listCollections", "convertToCapped", "createCollection", "createIndex", "dropIndex", "insert", "remove", "renameCollectionSameDB", "update"]} ],
roles: []
}
);
创建角色效果很好,但是当我使用时:
use admin
db.grantRolesToUser(
"P-DXdbUser",
[ "readWriteMinusDropRole" , ] )
它将为用户添加角色,但是该角色似乎没有任何作用。当我从P-DXdbUser执行此命令时:
use TestDB
db.getCollection('TestCollection').getIndexes()
它不返回任何结果。我在说明网页上的这个位置确实用TestDB替代了社交功能:
resource: { db: "social", collection: ""},
但是它不起作用。任何帮助将不胜感激。
这是P-DXdbUser的相关Json:
{
"_id" : "DX.dxdbuser",
"user" : "dxdbuser",
"db" : "DX",
"roles" : [
{
"role" : "readWrite",
"db" : "DX"
},
{
"role" : "readWrite",
"db" : "LoadTracking"
},
{
"role" : "readWrite",
"db" : "MacroPoint"
},
{
"role" : "readWrite",
"db" : "LoadPosting"
},
{
"role" : "readWriteMinusDropRole",
"db" : "TestDB"
}
]
}
我的目标是通过该角色将用户的访问权限限制在所有数据库中,但是现在,我只是在弄乱TestDB。
答案 0 :(得分:0)
好吧,经过几个小时的试验,我终于弄清楚了我做错了什么,以及我如何使用该指南误导了我。
为了将角色应用于用户,您必须将其应用于该角色所属的数据库。在这种情况下,该数据库为admin(我不确定是否可以向admin以外的数据库添加角色)。根据教程,您应该在admin中创建角色,但随后在向用户授予角色时指定要应用到的数据库。这是不正确的,这使我感到非常困惑,为什么这是必须的,因为在角色本身内,您需要指定允许操作的数据库。
答案是,您确实要指定您希望角色具有在角色本身内执行操作的权限的数据库,而不是将角色授予用户时的权限。将角色授予用户时,您需要指定该角色所属的数据库!而已!这是解决我的问题的代码段。
这是我创建的角色的Json(测试完成后,我将更改名称):
{
"_id" : "admin.readWriteMinusDropRoleTest",
"role" : "readWriteMinusDropRoleTest",
"db" : "admin",
"privileges" : [
{
"resource" : {
"db" : "TestDB",
"collection" : ""
},
"actions" : [
"collStats",
"convertToCapped",
"createCollection",
"createIndex",
"dbHash",
"dbStats",
"dropIndex",
"find",
"insert",
"killCursors",
"listCollections",
"listIndexes",
"remove",
"renameCollectionSameDB",
"update"
]
}
],
"roles" : []
}
请注意,该角色是其成员的数据库是“ admin”,但是指定为可以与其交互的资源的数据库是“ TestDB”。
以下是与用户相关的Json:
{
"role" : "readWriteMinusDropRoleTest",
"db" : "admin"
}
通过指定管理数据库,我现在可以使用该用户帐户按预期与TestDB进行交互。