CouchDB - 防止未经授权的读取

时间:2011-01-19 00:35:57

标签: couchdb

CouchDB有一个机制来防止未经授权的写入。

它还可以防止未经授权的读取吗?

1 个答案:

答案 0 :(得分:23)

是的,CouchDB可以防止未经授权的读取。不幸的是,它稍微不那么简单。

想象一下秘密拍卖应用程序。您出价20美元,我出价10美元;沙发文件中的每个出价。 Couch让我们阅读我们自己的投标文件,但没有其他人。 然而,有一个map-reduce视图显示平均值。我加载视图并看到平均值是15美元,因此我得出结论,您的出价是20美元,我已经破坏了安全策略。 查看输出可能会泄露部分或全部文档的信息。在文档级强制执行安全性是不可行的。这就是读取访问权限在数据库级别的原因。

我知道,这很糟糕。但这是唯一正确,可扩展的答案。

这是Couch理念创建许多数据库的部分原因 - 甚至每个用户一个(或更多!)。对数据库的读取权限在数据库readers对象的_security值中设置。 (注意,CouchDB中继中的字段readers was renamed to members,因为它还指定了谁可以写入数据库。)

这种技术的工作原理如下:

  1. 为每个用户创建一个数据库。它将保存用户可能阅读的所有文档。将用户(或用户的角色)添加到_security对象。
  2. 在master数据库中,创建一个实现读取策略的过滤器函数。 (它可以与validate_doc_update共享代码。)
  3. 使用?filter=my_filter_function从主数据库复制到用户的数据库。
  4. 允许用户加载(或复制)他们的数据库。
  5. 当然,这完全适用于纯Couch应用程序,用户可以直接访问Couch。如果您有一个中间层(MVC控制器,或只是一个反向HTTP代理),那么您可以在用户和沙发之间强制执行策略。但要小心。例如,_show函数或_rewrite规则可能允许用户加载视图或文档,无论您的策略如何。

    祝你好运!