【问题标题】:how give different privilege for user and admin in mongodb如何在mongodb中为用户和管理员赋予不同的权限
【发布时间】:2015-06-19 05:40:23
【问题描述】:

我正在使用sails 和MongoDB 创建一个应用程序。我需要三个级别的用户。

  • 超级管理员
  • 管理员
  • 用户

我想为每个用户赋予不同的权限

  • 超级管理员可以访问整个数据库。
  • 管理员可以访问与该字段相关的数据
  • 用户可以访问与用户相关的数据。

那么如何为不同类型的用户使用不同的模式。并限制一个用户访问其他资源。

【问题讨论】:

    标签: javascript mongodb mongoose sails.js


    【解决方案1】:

    我想给每个用户不同的权限

    • 超级管理员可以访问整个数据库。
    • 管理员可以访问与该字段相关的数据
    • 用户可以访问与用户相关的数据。

    您需要的主要是文档级访问控制,用户可以在其中根据特定字段中的值访问document。不幸的是,从 3.0 版开始,还没有任何内置方法可以在文档/字段级别提供访问控制。 Mongo 的 ACL 仅用于集合级别。

    ..那么如何为不同类型的用户使用不同的模式。和 限制一个用户访问其他资源。

    由于上述原因,如果“资源”是指“文档”,则仅在数据库级别是不可能的。但是,您仍然可以设法在应用程序级别(sailJS)实现类似的功能。 在数据库级别,您能做的最好的事情就是将该用户文档移至不同的集合。您可以使用 createRole() 方法创建角色并指定其权限

    对于超级管理员:

    db.createRole({ role: "SuperAdmin",
      privileges: [
        { resource: { db: "myCustomDB", collection: "" }, actions: [ "find", "update", "insert", "remove" ]}
      ],
      roles: []
    })
    

    超级管理员可以访问 myCustomDB 数据库中的所有集合并执行 findupdateinsertremove 操作

    对于管理员:

    db.createRole({ role: "Admin",
      privileges: [
        { resource: { db: "myCustomDB", collection: "AdminCollection" }, actions: [ "find", "update", "insert", "remove" ]},
        { resource: { db: "myCustomDB", collection: "" }, actions: [ "find"]}
      ],
      roles: []
    })
    

    管理员可以访问他们自己集合中的所有文档并执行 CRUD 操作。但是,它们只能只读访问数据库中的任何其他集合。

    对于用户:

    db.createRole({ role: "User",
      privileges: [
        { resource: { db: "myCustomDB", collection: "UserCollection" }, actions: [ "find", "update", "insert", "remove" ]}
      ],
      roles: []
    })
    

    注意:如果您使用的是 2.4(或更低)版本,则需要将该用户集合移动到不同的数据库。 MongoDB 2.4(及以下)ACL 仅进入数据库级别。

    【讨论】:

      【解决方案2】:

      假设您正在处理一个数据库名称“records”

      在 mongo shell 中 >>

      //SuperADMIN
      use admin
      db.createUser(
       {
         user: "superuser",
         pwd: "12345678",
         roles: [ "root" ]
       }
       )
      
      
       //ADMIN
       use records
       db.createUser
       (
         {
           user: "recordsUserAdmin",
           pwd: "password",
           roles: [ { role: "userAdmin", db: "records" } ]
         }
       )
      
      
      
      
      
      //Any User
      use records
      db.createUser(
       {
          user: "recordUser",
          pwd: "12345678",
          roles: [
             { role: "read", db: "records" },
             { role: "read", db: "user" },
             { role: "read", db: "sales" },
             { role: "readWrite", db: "accounts" }
          ]
        }
       )
      

      更多信息:

      Mongo tutorial create admin

      Add user to mongo

      【讨论】:

        【解决方案3】:

        您所描述的仅在数据库级别是不可能实现的。

        可以创建另一个对数据库具有不同读/写权限的用户。但是,无法创建有权仅查看与自己相关的数据的用户。您需要做的是在应用程序中执行身份验证,以查看用户是否有权查看所述数据。显然这是非常具体的实现,但它会类似于执行“用户 ABC 是数据 XYZ 的所有者吗?如果是,让他们看到它,如果不是,错误”的应用程序检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-19
          • 1970-01-01
          • 1970-01-01
          • 2020-12-11
          • 1970-01-01
          • 2021-05-23
          相关资源
          最近更新 更多