我们有一个包含多个用户和复杂的权限系统的 couchapp 应用程序。
我们的模型有两种:Foo 和 bar。
用户对自己的 Foo 和 Bar 拥有管理员访问权限,并且可以被授予查看、更改和删除其他人的 Foo 和 Bar 的权限。
Example:
用户 Sabrina 有以下型号:
Foo {
_id: 1
}
Foo {
_id: 2
}
Bar {
_id:1
}
Bar {
_id:2
}
当然,真正的模型是更大的文档。
她想要授予 Giulia 对她的 Foos 的读取权限,以及对她的第一个栏的读取和写入权限。她还希望朱莉娅不能再去参加她的第二次酒吧。
我们如何在 couchdb 中对这种权限进行建模?
这是我们正在使用的解决方案,但它看起来很复杂,我们想知道是否有更简单的解决方案:
我们有多种角色可供选择:{username}:admin
:可以读取、写入、删除与用户相关的每个数据库上的所有内容{username}:foos:read
:可以读取foos数据库中与用户相关的每一个文档{username}:foos:write
:可以写入foos数据库中与用户相关的每一个文档{username}:{bar}:read
:可以读取与用户相关的Bar数据库{username}:{bar}:write
:可以写入与用户相关的Bar数据库
当 Sabrina 注册到应用程序时,我们创建一个新的sabrina-foos
数据库,我们将角色授予用户 Sabrinasabrina:admin
.
The sabrina-foos
数据库是用一个创建的_security
授予角色访问权限的文档sabrina:admin
, sabrina:foos:read
, sabrina:foos:write
.
The sabrina-foos
数据库是使用验证功能创建的,该功能允许对角色进行写访问sabrina:admin
, sabrina:foos:write
.
当 Sabrina 决定让 Giulia 看到她的食物时,我们给了 Giulia 这个角色sabrina:foos:read
当 Sabrina 创建一个名为“Bar 1”的新 Bar 时,我们创建一个新的 Barsabrina-bar_1
数据库。
The sabrina-bar_1
数据库是使用授予角色访问权限的 _security 文档创建的sabrina:admin
, sabrina:bar_1:read
, sabrina:bar_1:write
The sabrina-bar_1
数据库是使用验证功能创建的,该功能允许对角色进行写访问sabrina:admin
, sabrina:bar_1:write
.
当然,作为一个 CouchApp,数据库的创建和用户模型的编辑是由节点进程处理的。