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

pok*_*tad 7 couchdb

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

function(doc, req) {
  // what is inside req???
  return false;
}
Run Code Online (Sandbox Code Playgroud)

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

这个userCtx是什么?当您针对CouchDB进行经过身份验证的请求时,使用HTTP基本身份验证,安全cookie身份验证或OAuth,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;
}
Run Code Online (Sandbox Code Playgroud)

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

curl -X POST http://127.0.0.1:5984/_replicate \
-d '{"source":"database", \
     "target":"http://example.com:5984/database", \
     "filter":"example/filtername"
     }'
Run Code Online (Sandbox Code Playgroud)

问题

有没有办法在默认情况下强制执行特定的过滤器,以便用户只能复制自己的数据?我认为最好的方法是使用CouchDB的前端,比如Nginx,并将所有复制请求限制为包含该过滤器的复制请求.思考?想要在没有CouchDB前面的另一层的情况下做到这一点.

Kxe*_*pal 6

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

没有任何方法可以强制应用更改Feed过滤器或其他参数,例如views.但是,您可以使用重写将请求包装到具有预定义查询参数的某些资源,甚至使用动态请求.这有点不是你想要的解决方案,但是更好的是nginx和他身边的一些逻辑:可能,你应该允许用户使用自定义查询参数指定自定义过滤器,并且只有在没有指定时才强制你自己, 对?

PS Inside req对象对当前请求非常有用.部分是在wiki上描述的,但它有点过时了.但是,通过简单的show功能可以轻松查看它:

function(doc, req){
    return {json: req}
}
Run Code Online (Sandbox Code Playgroud)

  • 例如,如果您的应用程序是邮箱,那么可能会有一个包含所有“邮件”的庞大数据库和许多包含个人用户邮件的小型数据库。这个巨大的 db 会将传入的邮件“扇出”给用户 dbs 并从中获取传出的邮件。对于文档交换应用程序 p2p 模型会更受欢迎。 (2认同)