Javascript 如何在mongodb中为用户和管理员授予不同的权限

Javascript 如何在mongodb中为用户和管理员授予不同的权限,javascript,mongodb,mongoose,sails.js,Javascript,Mongodb,Mongoose,Sails.js,我正在使用sails和MongoDB创建一个应用程序。我需要三个级别的用户 超级管理员 管理员 使用者 我想为每个用户授予不同的权限 超级管理员可以访问整个数据库 管理员可以访问与该字段相关的数据 用户可以访问与用户相关的数据 因此,如何为不同类型的用户使用不同的模式。并限制一个用户访问其他资源 您所描述的内容不可能仅在数据库级别实现 可以创建另一个对数据库具有不同读/写权限的用户。但是,无法创建仅具有查看与其自身相关数据的权限的用户。您需要做的是在应用程序中执行身份验证,以查看用户是否

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

  • 超级管理员
  • 管理员
  • 使用者
我想为每个用户授予不同的权限

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

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

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

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

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

  • 超级管理员可以访问整个数据库
  • 管理员可以访问与该字段相关的数据
  • 用户可以访问与用户相关的数据
您需要的主要是文档级访问控制,用户可以根据特定字段中的值访问
文档。不幸的是,从3.0版开始,还没有任何内置方式在文档/字段级别提供访问控制。Mongo的ACL仅用于收集级别

…因此,如何为不同类型的用户使用不同的模式。和 限制一个用户访问其他资源

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

对于超级管理员:

db.createRole({ role: "SuperAdmin",
  privileges: [
    { resource: { db: "myCustomDB", collection: "" }, actions: [ "find", "update", "insert", "remove" ]}
  ],
  roles: []
})
db.createRole({ role: "Admin",
  privileges: [
    { resource: { db: "myCustomDB", collection: "AdminCollection" }, actions: [ "find", "update", "insert", "remove" ]},
    { resource: { db: "myCustomDB", collection: "" }, actions: [ "find"]}
  ],
  roles: []
})
db.createRole({ role: "User",
  privileges: [
    { resource: { db: "myCustomDB", collection: "UserCollection" }, actions: [ "find", "update", "insert", "remove" ]}
  ],
  roles: []
})
超级管理员可以访问myCustomDB数据库中的所有集合,并执行
查找
更新
插入
删除
操作

对于管理员:

db.createRole({ role: "SuperAdmin",
  privileges: [
    { resource: { db: "myCustomDB", collection: "" }, actions: [ "find", "update", "insert", "remove" ]}
  ],
  roles: []
})
db.createRole({ role: "Admin",
  privileges: [
    { resource: { db: "myCustomDB", collection: "AdminCollection" }, actions: [ "find", "update", "insert", "remove" ]},
    { resource: { db: "myCustomDB", collection: "" }, actions: [ "find"]}
  ],
  roles: []
})
db.createRole({ role: "User",
  privileges: [
    { resource: { db: "myCustomDB", collection: "UserCollection" }, actions: [ "find", "update", "insert", "remove" ]}
  ],
  roles: []
})
管理员可以访问自己集合中的所有文档并执行CRUD操作。但是,它们只能以只读方式访问数据库中的任何其他集合

对于用户:

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

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

假设您正在处理数据库名“记录”

在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" }
    ]
  }
 )
有关更多信息: