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



我在查找复制筛选器中使用的请求对象参数的文档时遇到问题(下面示例中的"req"):

function(doc, req) {
// what is inside req???
return false;
}

这篇旧的CouchBase博客文章有一个小代码片段,显示userCtx变量是请求对象的一部分:

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

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

function(doc, req) {
// require a valid request user that owns the current doc
if (!req.userCtx.name) {
throw("Unauthorized!");
}
if(req.userCtx.name == doc.owner) {
return true;
}
return false;
}

但现在的问题是,CouchDB要求复制的发起方明确选择筛选方法(在这种情况下,发起方是我的web应用程序的移动用户):

curl -X POST http://127.0.0.1:5984/_replicate 
-d '{"source":"database", 
"target":"http://example.com:5984/database", 
"filter":"example/filtername"
}'

问题

是否有一种方法可以在默认情况下强制执行特定的筛选器,从而限制用户只能复制自己的数据?我认为最好的方法是使用CouchDB的前端,如Nginx,并将所有复制请求限制为包含该过滤器的请求。想法?我很想在CouchDB前面没有另一层的情况下实现这一点。

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

没有任何方法可以强制应用更改提要过滤器或其他类似视图的参数。但是,您可以使用重写来使用预定义的查询参数甚至动态查询参数包装对某些资源的请求。这有点不是你所期望的解决方案,但比nginx和他身边的一些逻辑更好:可能,你会允许用户使用自定义查询参数指定自定义过滤器,并且只有在没有指定任何内容的情况下才强制执行你自己的过滤器,对吧?

第页。S.内部req对象对于当前请求非常有用。维基对它进行了部分描述,但它有点过时了。然而,使用简单的显示功能很容易查看:

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

相关内容

最新更新