2011-10-28 41 views
5

我想知道如何構建一個系統,用戶可以在其中向其他用戶發送消息。當然,每個人都需要只能訪問他的收件箱,所以我們需要每個用戶的數據庫基礎設施。以http://guide.couchdb.org/draft/notifications.html爲例,我們看到用戶可以將消息放入收件人的數據庫中。簡單而有效。帶私人消息系統的CouchDB每用戶數據庫場景

但是如果我們不想讓用戶知道收件人數據庫名稱怎麼辦?如果我們想將被找上了領域的消息文件(可以是用戶名,完全無關的他的數據庫名)解析收件人」數據庫​​系統:

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

似乎像額外層完美的任務,但後來就沒有樂趣,不值得的問題,所以我們要去嘗試,並與複製解決它:

  1. 用戶將郵件文件中主數據庫
  2. 複製任務(我們將有一個任務爲每個用戶)提取文檔使用過濾器,過濾器由提供字段。名稱「john.kowalski」將作爲過濾函數的參數傳遞。
  3. 文檔以收件人數據庫結尾。

然而,這產生了一個問題,因爲主數據庫必須是所有用戶都可以看到!所以......如果我們可以添加用戶 - >主複製任務,那麼這些消息將從用戶數據庫中轉移到主數據庫中,然後放入收件人數據庫(哦,上帝,它變得越來越複雜,我們可能已經通過試圖以這種方式解決它而浪費了我們的時間,但讓我們試試)。

  1. 用戶將郵件文件在他的數據庫
  2. 複製任務取入該文檔,但不能使用任何類型的過濾功能,因爲在這種情況下,過濾器是由用戶所擁有,因此不能被信任。
  3. 主數據庫驗證文檔 - 它檢查是否與字段是與源數據庫關聯的字段。
  4. 以前方法中使用的複製任務將文檔傳輸給收件人。

有一個在這裏第三步的問題(沒有這一步,用戶將能夠通過填寫虛假信息從場送冒充其他用戶的消息) - 我們如何能夠通過額外的數據驗證功能,唯一的參數那裏,據我所知是:

  • 舊文檔
  • 新的文檔(文檔到被寫入登錄用戶名,角色,其DB)
  • 用戶上下文
  • 安全對象?

通過使用1.1.0中引入的複製器數據庫功能,我們可以將user_ctx上下文傳遞給複製任務。這個對象是否可以包含自定義數據而不是真實的用戶信息?這將如何影響CouchDB處理數據庫訪問的標準方式?

如果可行,複製任務只需將收件人姓名填充爲user_ctx下的參數,則驗證功能將使用該值與字段中的進行比較。用戶除了他以外沒有辦法「發送」消息。

+0

有一個記錄,我很清楚這個事實,我可能只是在這裏濫用複製,而一些以admin身份運行的worker作業(這樣它可以讀取所有數據庫)可以以更健壯和簡單的方式移動文檔。 – Bartosz

回答

1

您可以設置沙發,以便用戶有權讀取和寫入數據庫中的常規文檔,但不能修改_design文檔。這樣,您可以信任用戶數據庫中的驗證,除非它部署在用戶站點上,但是無論如何您需要將數據複製到數據庫。我想我可以同意你的說法,它可以完成工作任務:)。作爲一個事實,我認爲這將是「沙發之路」,考慮到分片/集羣也是通過外部的Python腳本完成的。

+0

可以工作,但我想允許用戶修改他們的設計文檔(通過couchapps定製),因此他們需要成爲他們數據庫的管理員。 – Bartosz

2

你在這裏做了一個重要的假設:

然而,這產生了一個問題,因爲主數據庫將不得不 所有用戶都可以看到!

有避免具有主數據庫對所有用戶可見的替代解決方案。用戶不必讓每個用戶直接將消息文檔放入主數據庫,而是可以讓用戶將消息文檔保存到他們自己的數據庫中,並設置過濾複製以將消息傳輸到主數據庫。主數據庫可能受到限制,因此應用程序的常規用戶無法訪問它。用戶數據庫和主數據庫之間的複製需要由管理員啓動,但這隻需要爲每個用戶執行一次,因爲複製任務在當前版本的CouchDB中是持久的。