【发布时间】:2014-09-16 04:14:29
【问题描述】:
我们有一个 couchapp 应用程序,它有多个用户和一个复杂的权限系统。 我们的模型有两种:Foo 和 bar。
用户拥有自己的 Foo 和 Bar 的管理员权限,并且可以被授予查看、更改和删除其他人的 Foo 和 Bar 的权限。
例子:
用户 Sabrina 有这些模型:
Foo {
_id: 1
}
Foo {
_id: 2
}
Bar {
_id:1
}
Bar {
_id:2
}
当然,真正的模型是更大的文档。
她想授予 Giulia 对她的 Foos 的读取权限,以及对她的第一个 bar 的读写权限。她还希望 Giulia 不能看到她的第二个酒吧。
我们如何在 couchdb 中为这种权限建模?
这是我们正在使用的解决方案,但它似乎很复杂,我们想知道是否有更简单的解决方案:
我们有多种角色可供选择:
{username}:admin: 可以读取、写入、删除与用户相关的每个数据库上的所有内容
{username}:foos:read:可以读取foos数据库中与用户相关的每一个文档
{username}:foos:write:可以写入foos数据库中与用户相关的每一个文档
{username}:{bar}:read:可以读取用户相关的Bar数据库
{username}:{bar}:write: 可以写用户相关的Bar数据库
当 Sabrina 注册到应用程序时,我们会创建一个新的 sabrina-foos 数据库,并将角色 sabrina:admin 分配给用户 Sabrina。
sabrina-foos 数据库是使用_security 文档创建的,该文档授予对角色sabrina:admin、sabrina:foos:read、sabrina:foos:write 的访问权限。
sabrina-foos 数据库是使用验证功能创建的,该功能允许对角色sabrina:admin、sabrina:foos:write 进行写访问。
当 Sabrina 决定让 Giulia 看到她的 foos 时,我们赋予 Giulia 角色 sabrina:foos:read
当 Sabrina 创建一个名为“Bar 1”的新 Bar 时,我们会创建一个新的 sabrina-bar_1 数据库。
sabrina-bar_1 数据库是使用 _security 文档创建的,该文档授予对角色 sabrina:admin、sabrina:bar_1:read、sabrina:bar_1:write 的访问权限
sabrina-bar_1 数据库是使用验证功能创建的,该功能允许对角色sabrina:admin、sabrina:bar_1:write 进行写访问。
当然,作为一个 CouchApp,数据库的创建和用户模型的编辑由 Node Process 处理。
【问题讨论】:
-
您是否考虑过将授权完全外部化?以 XACML 为例。
-
@DavidBrossard XACML 看起来不错。感谢分享。
标签: permissions authorization couchdb couchapp