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

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

{
    "to": "john.kowalski",
    "from": "jake.podolski",
    "subject": "hi",
    "message": "..."
}

对于其他层级来说,这似乎是一项完美的任务,但是那将毫无乐趣,也不值得提出疑问,因此我们将尝试通过复制解决它:
  • 用户将消息文档放入主数据库
  • 复制任务(每个用户将有一个任务)使用过滤器提取该文档,该过滤器过滤_changes feed by字段。名称“john.kowalski”将作为过滤器函数的参数传递。
  • 文档在收件人数据库中结束。

  • 但是,这会产生问题,因为主数据库必须对所有用户可见!所以...如果我们也能够添加用户->主复制任务,以便从传输到主数据库的用户数据库中提取消息,然后将其放置在收件人数据库中(天哪,它变得越来越复杂,我们可能已经尝试通过这种方式解决它,因此已经在浪费时间,但是请尝试)。
  • 用户将消息文档放入其数据库
  • 复制任务将获取该文档,但不能使用任何类型的过滤器功能,因为在这种情况下,过滤器归用户所有,因此不能被信任。
  • 主数据库验证该文档-它检查from字段是否与源数据库关联。
  • 在先前方法中使用的复制任务将文档传输给收件人。

  • 此处的第三步存在问题(没有该步,用户将可以通过从字段中填写虚假信息来发送冒充其他任何用户的消息)-我们如何才能将其他数据传递给验证功能,这是迄今为止唯一的参数据我所知:
  • 旧文档
  • 新文档
  • 用户上下文(已记录文档的用户名,角色,数据库)
  • 安全对象?

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

    如果可能的话,复制任务将只将收件人名称填充为user_ctx下的参数,然后验证功能将使用该值与from字段进行比较。用户将无法以其他人的身份“发送”消息。

    最佳答案

    这个问题类似于关于CouchDB user creation的问题。

    对于这个问题,我很乐观,我的inbox database补丁程序将使一切变得更好。

    关于具有专用消息传递系统的CouchDB每用户数据库方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7929869/

    10-15 13:38
    查看更多