带有私有(private)消息系统的 CouchDB 每用户数据库场景

标签 couchdb

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

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

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

对于附加层来说,这似乎是一个完美的任务,但这样就没有乐趣并且不值得提出问题,所以我们将尝试通过复制来解决它:
  • 用户将消息文档放入主数据库
  • 复制任务(我们将为每个用户设置一个任务)使用过滤器获取该文档,该过滤器过滤 _changes 提要的字段。名称“john.kowalski”将作为过滤器函数的参数传递。
  • 文档在收件人数据库中结束。

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

  • 这里的第三步有问题(如果没有这一步,用户将能够通过在字段中填写虚假信息来模拟任何其他用户的消息) - 我们如何能够将额外的数据传递给验证函数,那里唯一的参数据我所知:
  • 旧文档
  • 新文档
  • 用户上下文(记录的用户名、角色、正在写入文档的数据库)
  • 安全对象?

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

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

    最佳答案

    你在这里做了一个很大的假设:

    However, this creates a problem, because main database would have to be visible to all users!



    有一个替代解决方案可以避免所有用户都可以看到主数据库。您可以让用户将消息文档保存到他们自己的数据库中并设置过滤复制以将消息传输到主数据库,而不是让每个用户将消息文档直接放入主数据库。可以限制主数据库,使您的应用程序的普通用户无法访问它。用户数据库和主数据库之间的复制需要由管理员启动,但这只需为每个用户执行一次,因为复制任务在当前版本的 CouchDB 中是持久的。

    关于带有私有(private)消息系统的 CouchDB 每用户数据库场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929869/

    相关文章:

    javascript - 使用 mustache 时在 Couchapp 列表中超时

    node.js - 多个组织在沙发上的最佳实践

    database - 我可以在 CouchDB 中进行事务和锁定吗?

    node.js - 使用 nano 将 session 传递给 couchDB

    couchdb - 无法在 CouchDB 中添加设计文档(以 "_"开头)

    CouchDB Mango 查询 - 将值与数组项匹配

    couchdb - 分布式数据库,轻负载节点多

    mongodb - 免费的 CORS 代理

    database - 何时使用 CouchDB 与 RDBMS

    python - Mongodb 或 Couchdb 与 django 构建类似于顶级编码器的应用程序?