CouchDB - 防止未经授权的读取

nor*_*gon 11 couchdb

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

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

Jas*_*ith 23

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

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

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

这是Couch理念创建许多数据库的部分原因 - 甚至每个用户一个(或更多!).对数据库的读取权限readers在数据库_security对象的值中设置.(注意,字段阅读器已重命名为 CouchDB主干中的成员,因为它还指定了谁可以写入数据库.)

该技术的工作方式如下:

  1. 为每个用户创建一个数据库.它将保存用户可能阅读的所有文档.将用户(或用户的角色)添加到_security对象.
  2. 在master数据库中,创建一个实现读取策略的过滤器函数.(它可以与validate_doc_update.分享代码.)
  3. 使用从主数据库复制到用户的数据库?filter=my_filter_function.
  4. 允许用户加载(或复制)他们的数据库.

当然,这完全适用于纯Couch应用程序,用户可以直接访问Couch.如果您有一个中间层(MVC控制器,或只是一个反向HTTP代理),那么您可以在用户和沙发之间强制执行策略.但要小心.例如,_show函数或_rewrite规则可能允许用户加载视图或文档,尽管您的策略.

祝好运!

  • 你的第二个问题更多是关于**撤销**读取访问而不是**授予**读取访问权限.我建议你提出一个新问题("如何撤销CouchDB安全模型中的读取访问权限").如果可以,我会尽快给出答案! (2认同)