具有私人消息传递系统的CouchDB每用户数据库方案

Bar*_*osz 5 couchdb

我想知道如何构建一个用户能够向其他用户发送消息的系统.当然,每个人都需要只能访问他的收件箱,因此我们需要每用户数据库基础设施.按照http://guide.couchdb.org/draft/notifications.html中的示例,我们看到用户可以将消息放入收件人的数据库中.简单有效.

但是,如果我们不想让用户知道收件人数据库名称呢?如果我们想要一个通过查看消息文档的to字段(可能是用户名,与其数据库名称完全无关)来解析收件人数据库的系统,该怎么办?

{
    "to": "john.kowalski",
    "from": "jake.podolski",
    "subject": "hi",
    "message": "..."
}
Run Code Online (Sandbox Code Playgroud)

对于额外的等级来说,这似乎是一个完美的任务,但那么它就没有乐趣而且不值得提问,所以我们将尝试通过复制来解决它:

  1. 用户将消息文档放在主数据库中
  2. 复制任务(我们将为每个用户设置一个任务)使用筛选器来提取该文档,该筛选器将_changes的饲料过滤字段.名称"john.kowalski"将作为过滤器函数的参数传递.
  3. 文档以收件人数据库结尾.

但是,这会产生问题,因为主数据库必须对所有用户可见!那么......如果我们能够添加用户 - >主复制任务,那么消息将从用户数据库中传输到主数据库,然后放入收件人数据库(哦,主,它变得越来越复杂,我们可能已经浪费时间试图以这种方式解决它,但让我们试试).

  1. 用户将消息文档放入其数据库中
  2. 复制任务提取该doc,但不能使用任何类型的过滤器功能,因为此情况下的过滤器由用户拥有,因此不可信任.
  3. 主数据库验证文档-它检查是否场是与源数据库相关联的一个.
  4. 先前方法中使用的复制任务将文档传输到收件人.

这里的第三步存在问题(没有该步骤,用户将能够通过填写来自字段的虚假信息来发送冒充任何其他用户的消息) - 我们如何能够将其他数据传递给验证函数,这是目前唯一的参数据我所知:

  • 老医生
  • 新文件
  • 用户上下文(记录的用户名,角色,正在编写文档的数据库)
  • 安全对象?

通过调用1.1.0中引入的复制器数据库功能,我们可以将user_ctx上下文传递给复制任务.这个对象是否可以包含自定义数据而不是真实的用户信息?这将如何影响CouchDB处理数据库访问的标准方式?

如果可能,复制任务只会将收件人名称作为user_ctx下的参数填充,则验证函数将使用该值与from字段进行比较.用户无法像其他人一样"发送"消息.

Jas*_*ith 1

这个问题与有关CouchDB 用户创建的问题类似。

与这个问题一样,我乐观地认为我的收件箱数据库补丁将使这一切变得更好。