我想知道如何構建一個系統,用戶可以在其中向其他用戶發送消息。當然,每個人都需要只能訪問他的收件箱,所以我們需要每個用戶的數據庫基礎設施。以http://guide.couchdb.org/draft/notifications.html爲例,我們看到用戶可以將消息放入收件人的數據庫中。簡單而有效。帶私人消息系統的CouchDB每用戶數據庫場景
但是如果我們不想讓用戶知道收件人數據庫名稱怎麼辦?如果我們想將被找上了到領域的消息文件(可以是用戶名,完全無關的他的數據庫名)解析收件人」數據庫系統:
{
"to": "john.kowalski",
"from": "jake.podolski",
"subject": "hi",
"message": "..."
}
似乎像額外層完美的任務,但後來就沒有樂趣,不值得的問題,所以我們要去嘗試,並與複製解決它:
- 用戶將郵件文件中主數據庫
- 複製任務(我們將有一個任務爲每個用戶)提取文檔使用過濾器,過濾器由提供字段。名稱「john.kowalski」將作爲過濾函數的參數傳遞。
- 文檔以收件人數據庫結尾。
然而,這產生了一個問題,因爲主數據庫必須是所有用戶都可以看到!所以......如果我們可以添加用戶 - >主複製任務,那麼這些消息將從用戶數據庫中轉移到主數據庫中,然後放入收件人數據庫(哦,上帝,它變得越來越複雜,我們可能已經通過試圖以這種方式解決它而浪費了我們的時間,但讓我們試試)。
- 用戶將郵件文件在他的數據庫
- 複製任務取入該文檔,但不能使用任何類型的過濾功能,因爲在這種情況下,過濾器是由用戶所擁有,因此不能被信任。
- 主數據庫驗證文檔 - 它檢查是否與字段是與源數據庫關聯的字段。
- 以前方法中使用的複製任務將文檔傳輸給收件人。
有一個在這裏第三步的問題(沒有這一步,用戶將能夠通過填寫虛假信息從場送冒充其他用戶的消息) - 我們如何能夠通過額外的數據驗證功能,唯一的參數那裏,據我所知是:
- 舊文檔
- 新的文檔(文檔到被寫入登錄用戶名,角色,其DB)
- 用戶上下文
- 安全對象?
通過使用1.1.0中引入的複製器數據庫功能,我們可以將user_ctx上下文傳遞給複製任務。這個對象是否可以包含自定義數據而不是真實的用戶信息?這將如何影響CouchDB處理數據庫訪問的標準方式?
如果可行,複製任務只需將收件人姓名填充爲user_ctx下的參數,則驗證功能將使用該值與字段中的進行比較。用戶除了他以外沒有辦法「發送」消息。
有一個記錄,我很清楚這個事實,我可能只是在這裏濫用複製,而一些以admin身份運行的worker作業(這樣它可以讀取所有數據庫)可以以更健壯和簡單的方式移動文檔。 – Bartosz