我想知道如何构建一个用户能够向其他用户发送消息的系统。当然,每个人都只需要能够访问他的收件箱,因此我们需要每个用户的数据库基础设施。以 http://guide.couchdb.org/draft/notifications.html 为例,我们看到用户可以将消息放入收件人的数据库中。简单有效。
但是,如果我们不想让用户知道收件人数据库名称怎么办?如果我们想要一个系统通过查看消息文档的 to 字段(可能是用户名,与他的数据库名称完全无关)来解析收件人的数据库怎么办:
{
"to": "john.kowalski",
"from": "jake.podolski",
"subject": "hi",
"message": "..."
}
对于附加层来说,这似乎是一个完美的任务,但这样就没有乐趣并且不值得提出问题,所以我们将尝试通过复制来解决它:
但是,这会产生一个问题,因为主数据库必须对所有用户可见!那么......如果我们也能够添加用户->主复制任务,这样消息将从用户数据库中提取并传输到主数据库,然后放入收件人数据库中(哦,上帝,它变得复杂了,我们可能已经通过尝试以这种方式解决它浪费了我们的时间,但让我们试试)。
这里的第三步有问题(如果没有这一步,用户将能够通过在字段中填写虚假信息来模拟任何其他用户的消息) - 我们如何能够将额外的数据传递给验证函数,那里唯一的参数据我所知:
通过查看 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/