CouchDB:限制用户仅复制自己的文档

CouchDB:限制用户仅复制自己的文档,couchdb,Couchdb,我很难找到复制筛选器中使用的请求对象参数的文档(以下示例中的“req”): 功能(单据、需求){ //里面是什么??? 返回false; } 这有一个小代码段,显示userCtx变量是请求对象的一部分: 这个userCtx是什么?当您针对 CouchDB,使用HTTP基本身份验证、安全cookie身份验证或OAuth, CouchDB将验证用户的凭据。如果它们与CouchDB匹配 用户,它用有关 用户 这个userCtx对象对于将文档复制限制为文档所有者非常有用。看看这个例子: 功能(单据、需

我很难找到复制筛选器中使用的请求对象参数的文档(以下示例中的“req”):

功能(单据、需求){
//里面是什么???
返回false;
}
这有一个小代码段,显示userCtx变量是请求对象的一部分:

这个userCtx是什么?当您针对 CouchDB,使用HTTP基本身份验证、安全cookie身份验证或OAuth, CouchDB将验证用户的凭据。如果它们与CouchDB匹配 用户,它用有关 用户

这个userCtx对象对于将文档复制限制为文档所有者非常有用。看看这个例子:

功能(单据、需求){
//需要拥有当前文档的有效请求用户
如果(!req.userCtx.name){
扔(“未经授权!”);
}
if(req.userCtx.name==doc.owner){
返回true;
}
返回false;
}
但现在的问题是CouchDB要求复制的发起方显式选择filter方法(在本例中,发起方是我的web应用的移动用户):

curl-X POSThttp://127.0.0.1:5984/_replicate \
-d'{“来源”:“数据库”\
“目标”:http://example.com:5984/database", \
“过滤器”:“示例/过滤器名称”
}'
问题


是否有一种方法可以在默认情况下强制实施特定的筛选器,从而限制用户仅复制自己的数据?我认为最好的方法是使用CouchDB的前端,比如Nginx,并将所有复制请求限制为包含该过滤器的复制请求。思想?如果没有CouchDB前面的另一层,您会喜欢这样做。

数据复制与用户读取数据的能力相匹配。因为如果您的用户在单个数据库中共享数据,那么他们所有人都有权将所有数据复制到本地沙发上。因此,除非将单个共享数据库拆分为多个个人数据库,否则无法应用任何文档读取限制—这是此类情况的常见用例

没有任何方法可以强制应用更改提要过滤器或视图等其他参数。但是,您可以使用预定义的查询参数,甚至使用动态参数,将请求包装到某些资源。这不是您期望的解决方案,但比nginx和他身边的一些逻辑更好:也许,您应该允许用户使用自定义查询参数指定自定义过滤器,并且只有在没有指定的情况下才强制您自己,对吗

p.S.Inside
req
对象对于当前请求非常有用。部分内容是在上一节中描述的,但有点过时了。但是,通过简单的显示功能可以轻松查看:

function(doc, req){
    return {json: req}
}

+1我的想法是使用nginx仅限制复制流量,这样用户就不能对特定文档或视图执行显式请求。我将不得不研究重写。@pokstad这是一个简单直观的想法,但“有缺陷”,因为有很多方法可以解决它:文档API、更改提要、视图、列表、显示、重写-您的nginx规则将非常庞大,并随着时间的推移而增长。这个问题的CouchDB模式是用户的个人数据库,它只包含用户能够读取并且可能需要更改的信息。易于设置、易于管理、易于保护数据。在这种情况下,Nginx可能会隐藏为每个用户提供公共URL的事实,但最好是保持显式(imho)。有一个很好的指南来实现每个用户的数据库couchdb环境吗?哦,我在大多数关于couchdb的演示中都看到了它,但是在我的书签中找不到任何有用的链接/:但是很简单:创建数据库,他的管理员/成员,使用筛选器推送DDoS,这些筛选器将数据从私有数据分割为共享数据,并为其创建复制规则。每个用户都将使用自己的数据库,而如果他与他人共享数据,数据将立即复制到他们身上。复制拓扑主要依赖于应用程序逻辑。例如,如果您的应用程序是邮箱,则可能会有一个巨大的数据库保存所有“邮件”,还有许多小型数据库保存个人用户的邮件。这个巨大的数据库将把收到的邮件“扇出”给用户数据库,并从用户数据库中获取传出的邮件。对于文档交换应用程序,更倾向于采用p2p模式。