Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建只能管理自己创建的文档的MongoDB用户_Mongodb - Fatal编程技术网

创建只能管理自己创建的文档的MongoDB用户

创建只能管理自己创建的文档的MongoDB用户,mongodb,Mongodb,我想知道有没有一种方法可以为一个数据库创建一个新用户,这个用户只能管理他创建的文档。 我已经阅读了MongoDB文档中关于角色和自定义角色的几乎所有内容,但找不到我想要的内容 我需要的是创建一个用户,该用户只能创建文档(而不是集合)、读取其他人的文档、编辑或删除自己的文档,并且不能编辑或删除其他用户创建的文档 这可能吗 如果没有,我是否可以实施一种变通方法?在创建文档时,您可以将用户id作为属性之一传递,以便在您想要更新或删除该文档时,检查尝试更新该文档的用户是否是最初创建该文档的人 有些东西具

我想知道有没有一种方法可以为一个数据库创建一个新用户,这个用户只能管理他创建的文档。 我已经阅读了MongoDB文档中关于角色和自定义角色的几乎所有内容,但找不到我想要的内容

我需要的是创建一个用户,该用户只能创建文档(而不是集合)、读取其他人的文档、编辑或删除自己的文档,并且不能编辑或删除其他用户创建的文档

这可能吗


如果没有,我是否可以实施一种变通方法?

在创建文档时,您可以将用户id作为属性之一传递,以便在您想要更新或删除该文档时,检查尝试更新该文档的用户是否是最初创建该文档的人

有些东西具有属性moviename、dataAdded和userid

userId=12;
const data = Something.findOne({someDocument});
if(userId==data.userid){
   //perform update/delete
}else{
   //return error
}

在创建文档时,您可以将用户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
数据库中创建它们


您也可以使用字段来代替自定义角色,但我认为自定义角色更灵活。

没有内置功能,但您可以使用如下自定义角色:

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
数据库中创建它们


您也可以使用字段来代替自定义角色,但我认为自定义角色更灵活。

谢谢您,Hanis。我现在正在做类似的事情。如果我可以从MongoDB中创建一个自定义角色,并且该角色可以被更具特权的用户覆盖,那么效率会更高。这可能会有帮助。再次感谢你,哈尼斯。这篇文章是关于Mongo Stitch的。我希望这可以应用到MongoDB社区版。我试试看。谢谢你,哈尼斯。我现在正在做类似的事情。如果我可以从MongoDB中创建一个自定义角色,并且该角色可以被更具特权的用户覆盖,那么效率会更高。这可能会有帮助。再次感谢你,哈尼斯。这篇文章是关于Mongo Stitch的。我希望这可以应用到MongoDB社区版。我来试试看。非常感谢你,Wernfried!这看起来很有希望。将尝试一下并让您知道。@rajashekar,这只适用于MongoDB Atlas,即当您使用MongoDB云服务时。当你在你的网站上运行MongoDB时,你就没有了它。非常感谢你,Wernfried!这看起来很有希望。将尝试一下并让您知道。@rajashekar,这只适用于MongoDB Atlas,即当您使用MongoDB云服务时。当您在自己的场所运行MongoDB时,您就没有了它。