【发布时间】:2021-05-21 15:32:21
【问题描述】:
我想知道是否有一种方法可以为只能管理他创建的文档的数据库创建新用户。 我已经阅读了 MongoDB 文档中有关角色和自定义角色的几乎所有内容,但找不到我要查找的内容。
我需要的是创建一个用户,该用户只能创建文档(不是集合),读取别人的文档,编辑删除自己的文档,不能编辑也不能删除其他用户创建的文档。
这可能吗?
如果没有,是否有我可以实施的解决方法?
【问题讨论】:
标签: mongodb
我想知道是否有一种方法可以为只能管理他创建的文档的数据库创建新用户。 我已经阅读了 MongoDB 文档中有关角色和自定义角色的几乎所有内容,但找不到我要查找的内容。
我需要的是创建一个用户,该用户只能创建文档(不是集合),读取别人的文档,编辑删除自己的文档,不能编辑也不能删除其他用户创建的文档。
这可能吗?
如果没有,是否有我可以实施的解决方法?
【问题讨论】:
标签: mongodb
在创建文档时,您可以将用户的 id 作为属性之一传递,因此当您想要更新或删除该文档时,您可以检查尝试更新该文档的用户是否是该人最初创建它。
有些东西有属性moviename、dataAdded、userid
userId=12;
const data = Something.findOne({someDocument});
if(userId==data.userid){
//perform update/delete
}else{
//return error
}
【讨论】:
没有任何内置功能,但您可以像这样使用自定义角色:
db.getSiblingDB("admin").createRole({
role: "myDefaultRole",
privileges: [
{
resource: { db: "myDB", collection: "myCollection" },
actions: ["update", "insert", "remove", "find"]
}
]
})
db.getSiblingDB("admin").createRole({
role: "mySuperRole",
privileges: [ {<maybe some additional privileges>} ],
roles: [{ role: "myDefaultRole", db: "admin" }, {<maybe some additional roles>}]
})
db.getSiblingDB("admin").createUser({
user: "user1",
pwd: passwordPrompt(),
roles: [{ role: "mySuperRole", db: "admin" }]
})
db.getSiblingDB("admin").createUser({
user: "user2",
pwd: passwordPrompt(),
roles: [{ role: "myDefaultRole", db: "admin" }]
})
function hasRole(v_user, v_role) {
return v_user != null && db.getSiblingDB(v_user.db).getUser(v_user.user, { filter: { roles: v_role } }) != null;
}
然后像这样使用它:
const currentUser = db.runCommand({ connectionStatus: 1 }).authInfo.authenticatedUsers.shift();
use myDB
db.myCollection.insertOne({ user: currentUser });
var data = db.myCollection.findOne({ someDocument });
if (data.user == currentUser || hasRole(currentUser, { role: "mySuperRole", db: "admin" })) {
//perform update/delete
} else {
//return error
}
注意,用户和角色可以在多个数据库中定义。因此,您应该同时检查数据库和用户名。我更喜欢在admin 数据库中创建它们。
除了自定义角色,您还可以使用字段customData,但我认为自定义角色更灵活。
【讨论】: