【问题标题】:Create MongoDB user who can only manage the documents he created创建只能管理自己创建的文档的MongoDB用户
【发布时间】:2021-05-21 15:32:21
【问题描述】:

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

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

这可能吗?

如果没有,是否有我可以实施的解决方法?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,哈尼斯。我现在正在做类似于这种方法的事情。如果我可以在 MongoDB 中创建一个可以被更多特权用户覆盖的自定义角色,那会更有效。
    • 好的,请查看此链接以创建自定义角色。它可能会有所帮助。 mongodb.com/blog/post/…
    • 再次感谢您,哈尼斯。这篇文章是关于 Mongo Stitch 的。我希望这可以应用于 MongoDB 社区版。我试试看。
    【解决方案2】:

    没有任何内置功能,但您可以像这样使用自定义角色:

    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,但我认为自定义角色更灵活。

    【讨论】:

    • 非常感谢,Wernfried!这看起来很有希望。会试一试,让你知道。
    • @rajashekar,这仅适用于 MongoDB Atlas,即当您使用 MongoDB 云服务时。当您在自己的场所运行 MongoDB 时,您就没有它。
    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多