couchdb 的高级权限

2024-01-13

我们有一个包含多个用户和复杂的权限系统的 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,数据库的创建和用户模型的编辑是由节点进程处理的。


你的设计很好。从您的问题来看,您似乎想要文档级身份验证。 couchdb 不提供对单个文档的保护,因此 剩下的唯一选择就是按数据库对文档进行分区并设置读写权限。

有两种选择。最简单的一种是使用rcouch 的读取时验证文档 https://github.com/rcouch/rcouch/wiki/Validate-documents-on-read。我也不是太 当然,但我认为在 couchdb 2.0 中,所有 rouch 的功能都已合并,因此如果您愿意稍等一下,您可以使用 couchdb 2.0(它现在应该随时可用!)。

另一种方法是做你正在做的事情,但是在一个_users http://couchdb.readthedocs.org/en/latest/intro/security.html?highlight=security数据库。在一个_users数据库你可以 创建用户并对他们进行身份验证_sessionsAPI。下面是它的工作原理。

  1. 您创建的每个新用户都会进入_users数据库。
  2. 在用户文档中,您可以存储允许用户查看哪些文档的列表,或者您是否可以查看哪些文档。 担心单个用户文档会变得太大,然后只存储一个指向可能包含以下内容的数据库的指针 用户可以查看的实际列表。
  3. Use the _sessionsapi首先对用户进行身份验证,然后获取用户授权的文档列表 阅读或编辑。
  4. 最后获取这些文档并show它给用户。

此方法的优点是您需要最少 2 次、最多 3 次 http 查询。用于验证并获取指向列表的指针。其次获取要获取的文档的实际列表。第三步获取这些文件。作为回报,您的架构将大大简化。

一个非常酷的属性_users数据库的优点是您可以增加配置中的身份验证缓存大小以容纳_user对象在内存中,因此访问时间会非常快。

如果我有一万个文档但只能检索其中一个怎么办?该函数会被调用一万次吗?

我目前没有安装 rcouch,但有一种简单的方法可以通过记录来测试它:-

function(doc, userCtx) {
    log("function called");
    if ((typeof doc.name !== 'undefined') && (doc.name != userCtx.name)) {
        throw({unauthorized: userCtx.name + ' cannnot read ' + doc._id});
    }
}

日志函数将在日志文件中以及正在运行的 couchdb 控制台上打印一条日志消息,以便您可以亲自查看更新函数被调用的次数。如果你能分享结果就太好了:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

couchdb 的高级权限 的相关文章

  • 我的自定义 AuthorizationPolicy.Evaluate() 方法永远不会触发

    我创建了一个具有自定义授权和身份验证的 wcf 服务 如您所见 public class AuthorizationPolicy IAuthorizationPolicy string id Guid NewGuid ToString pu
  • 如何在 Laravel 中使用主密码登录用户?

    在 Laravel 中 我想使用主密码登录我的任何用户帐户 这是我在控制器中尝试过的 if Input get password master password email Input get email user User find em
  • 以非 root 用户身份使用 libusb-1.0 访问 USB 设备

    我正在尝试以 RHEL5 上的非 root 用户身份连接 USB 设备 该设备是一个 GPIO 接口 其文档可以在http www xdimax com sub20 sub20 html http www xdimax com sub20
  • iOS OneDrive (skydrive) 应用程序每次运行时都会显示权限对话框

    我正在开发一个 iOS 应用程序 让用户可以访问他们的 OneDrive SkyDrive 但我遇到了一个非常烦人的问题 用户第一次将应用程序链接到 OneDrive 时 一切都会按预期进行 他们必须输入用户 ID 和密码 然后他们必须同意
  • 我可以在 iOS 上使用 MongoDB 来替代 CoreData 吗?

    我刚刚开始阅读 MongoDB 和 CouchDB 等 NoSQL 技术 我有兴趣知道是否可以使用 MongoDB 或任何 NoSQL 技术来替代 Core Data 应用程序 核心数据应用程序可能需要很长时间来学习和实现 特别是如果您的应
  • android 权限 - CHANGE_COMPONENT_ENABLED_STATE

    我需要在我的代码中使用 android permission CHANGE COMPONENT ENABLED STATE 权限 因为我需要更新我的项目的另一个 apk 的组件 但它似乎并不真正适合我 这是我的代码
  • chrome.storage 在 chrome 扩展中未定义

    我正在开发一个 Google Chrome 扩展程序 并且已经为此工作了一段时间 所以它已经安装了一段时间 我更新了清单文件以包含 存储 权限并重新加载扩展 但是 当我在控制台中尝试时 chrome storage is undefined
  • 监控 AppFabric 缓存

    我在 3 台服务器 AppFabric 1 1 上设置了高度可用的 AppFabric 缓存 我想监视每台服务器上的本地缓存 如果它因任何原因而关闭 则将其启动备份 Problem 问题是权限 我编写了一个 Powershell 脚本来执行
  • 如何在Cloudant或CouchDB中使用skip参数?

    在 Cloudant 或 CouchDB 的索引中使用 Skip 参数是否存在潜在的性能损失 有更好的技术可以使用吗 The 在 CouchDB 中写入和查询 MapReduce 视图 http my safaribooksonline c
  • CouchDb 单个文档的大小限制是多少

    我对文档存储复杂的数据结构有疑问 该数据结构可能会有所不同 文档需要完整存储和检索 需要提供文档搜索字段 我开始在 MongoBb 中存储文档 但那里的文档大小限制为 16 MB 这对我来说不够 CouchDb 允许的单个文档的最大大小是多
  • 将自定义标头值传递给 IdentityServer4 Login

    当用户尝试登录时 我尝试将自定义标头值 无 cookie 传递给 IdentityServer4 这是所有设置的方式 自定义身份验证属性 AttributeUsage AttributeTargets Class AttributeTarg
  • “publish_actions”扩展权限是否可用于测试?

    我一直在尝试使用 publish actions 扩展权限来测试分数和成就 但是当我添加它时 它不会显示在 权限请求 页面中 就好像它被忽略了一样 我尝试了几种不同的方法 loginUrl facebook gt getLoginUrl a
  • 如何在CouchDB 2.0中创建TEXT索引?

    我正在读这篇文章https cloudant com blog mango json vs text indexes https cloudant com blog mango json vs text indexes我想在我的 Couch
  • 当请求太大时,Nginx(我认为)会以错误的权限保存文件

    所以 我对托管和 Linux 等都是完全陌生的 所以如果我说错了 请原谅我 我还在学习 我正在使用 Django 创建一个小型个人网站 我想把它放到网上看看是否一切正常 我从 linode 买了一台便宜的服务器 并使用 Digital Oc
  • couchdb读取身份验证

    我如何处理 couchdb 中的读取身份验证 我知道角色可以在单独的数据库中定义 但我想在文档级别实现读取身份验证 我正在考虑使用node js 但它似乎不是一个优雅的解决方案 因为couchdb也有一个http服务器 我不想再添加一个 或
  • Capistrano 无法部署到远程服务器

    SOLUTION 解决方案是将以下内容添加到 production rb 的顶部 unshift File expand path lib ENV rvm path Add RVM s lib directory to the load p
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • 发布操作权限错误

    我在发布操作时遇到问题 我将publish actions添加到Items中 但出现如下错误 It looks like you haven t made any API requests to access content with th
  • 如何防止 CouchDB 在更新简单计数器时创建文档修订

    我想将计数器存储在 CouchDB 文档中 并在每个页面视图上递增 CouchDB 将创建本文档的完整修订版 只需 1 次计数器更新 这样会不会占用太多空间 考虑到我一天的点击量为 100 万次 我一天内可能会查看该文档的 100 万次修订
  • Codekit文件权限问题(只读文件系统@dir_s_mkdir - /.sass-cache)

    出现以下错误 Compiling failed with this error Errno EROFS on line 239 of System Library Frameworks Ruby framework Versions 2 6

随机推荐