【发布时间】:2015-06-19 05:40:23
【问题描述】:
我正在使用sails 和MongoDB 创建一个应用程序。我需要三个级别的用户。
- 超级管理员
- 管理员
- 用户
我想为每个用户赋予不同的权限
- 超级管理员可以访问整个数据库。
- 管理员可以访问与该字段相关的数据
- 用户可以访问与用户相关的数据。
那么如何为不同类型的用户使用不同的模式。并限制一个用户访问其他资源。
【问题讨论】:
标签: javascript mongodb mongoose sails.js
我正在使用sails 和MongoDB 创建一个应用程序。我需要三个级别的用户。
我想为每个用户赋予不同的权限
那么如何为不同类型的用户使用不同的模式。并限制一个用户访问其他资源。
【问题讨论】:
标签: javascript mongodb mongoose sails.js
我想给每个用户不同的权限
- 超级管理员可以访问整个数据库。
- 管理员可以访问与该字段相关的数据
- 用户可以访问与用户相关的数据。
您需要的主要是文档级访问控制,用户可以在其中根据特定字段中的值访问document。不幸的是,从 3.0 版开始,还没有任何内置方法可以在文档/字段级别提供访问控制。 Mongo 的 ACL 仅用于集合级别。
..那么如何为不同类型的用户使用不同的模式。和 限制一个用户访问其他资源。
由于上述原因,如果“资源”是指“文档”,则仅在数据库级别是不可能的。但是,您仍然可以设法在应用程序级别(sailJS)实现类似的功能。 在数据库级别,您能做的最好的事情就是将该用户文档移至不同的集合。您可以使用 createRole() 方法创建角色并指定其权限。
对于超级管理员:
db.createRole({ role: "SuperAdmin",
privileges: [
{ resource: { db: "myCustomDB", collection: "" }, actions: [ "find", "update", "insert", "remove" ]}
],
roles: []
})
超级管理员可以访问 myCustomDB 数据库中的所有集合并执行 find、update、insert 和 remove 操作
对于管理员:
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 仅进入数据库级别。
【讨论】:
假设您正在处理一个数据库名称“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" }
]
}
)
更多信息:
【讨论】:
您所描述的仅在数据库级别是不可能实现的。
可以创建另一个对数据库具有不同读/写权限的用户。但是,无法创建有权仅查看与自己相关的数据的用户。您需要做的是在应用程序中执行身份验证,以查看用户是否有权查看所述数据。显然这是非常具体的实现,但它会类似于执行“用户 ABC 是数据 XYZ 的所有者吗?如果是,让他们看到它,如果不是,错误”的应用程序检查。
【讨论】: