9

我无法找到有关复制过滤器中使用的请求对象参数的文档(以下示例中的“req”):

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

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

这个 userCtx 是什么?当您使用 HTTP 基本身份验证、安全 cookie 身份验证或 OAuth 向 CouchDB 发出经过身份验证的请求时,CouchDB 将验证用户的凭据。如果它们与 CouchDB 用户匹配,它会使用有关用户的信息填充 req.userCtx 对象。

此 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 前面没有另一层的情况下做到这一点。

4

1 回答 1

6

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

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

PS Insidereq对象对当前请求非常有用。部分在wiki上进行了描述,但它有点过时了。但是,使用简单的显示功能很容易查看它:

function(doc, req){
    return {json: req}
}
于 2012-10-07T23:40:17.530 回答