本文經許可從原始位置 http://blogs.collab.net/subversion/authz_and_anon_ 轉載。已移除或更新失效連結。
作者:C. Michael Pilato
張貼 2007-03-22
最近第一次嘗試使用 Subversion 的路徑授權模組,結果比我計畫的更不簡單,因為我試圖將其用於允許匿名讀取存取的儲存庫。一開始進行得很順利,我從 使用 Subversion 進行版本控制 中複製並貼上了一些範例 httpd.conf 指令和 authz 檔案內容,並根據需要進行調整以符合我的需求。在短時間內,我得到了我認為完美的設定。我錯了。
假設你像我一樣,希望設定一個儲存庫,讓它允許匿名讀取大部分內容,認證讀取其餘內容,並認證寫入整個內容。你已經有一個 Apache htpasswd 檔案,其中包含你的寫入者使用者名稱和密碼雜湊,並且你已經設定 Apache 使用該 htpasswd 檔案進行認證,以及一個 authz 檔案進行授權。然後,你對你的 authz 檔案進行明顯的增補
[groups] writers = someuser1, someuser2, … [repository:/] * = r @writers = rw [repository:/trunk/private-area] * = @writers = rw
有一群人使用你的作者使用者名稱。有一個規則授予匿名使用者讀取全域的權限,而寫入權限僅授予作者。此外還有一個覆寫規則,會移除儲存庫私人區域中未驗證使用者的讀取權限。看起來很棒。
然後你開始測試。
在簽出儲存庫的 /trunk 目錄後,匿名使用者會取得你預期的內容,也就是樹狀結構,扣除 /trunk/private-area 目錄。
但你的經過驗證的準作者呢?啊,問題就在這裡!沒有經過驗證的使用者。由於匿名使用者可以簽出樹狀結構,因此 Apache 永遠不會要求你提供驗證憑證。而且你無法在 Apache 沒有要求驗證憑證時強制 Subversion 傳輸驗證憑證。
那麼有什麼解決方法?
首先,你可以完全停用匿名存取,並強制非作者共用一個使用者名稱,例如「anonymous」,以及一個公開的密碼。在你的 authz 規則中,使用者「anonymous」將只有讀取權限,而且只能在儲存庫的公開部分。此方法運作良好,但對非作者來說有點不便。他們現在必須提供密碼,儘管密碼不是機密,但對他們來說可能仍然不顯而易見和/或不知道。
其次,你可以保持原狀,並強制作者分別簽出儲存庫的私人區域。他們無法同時在單一工作副本中連接公開和私人區域,但這可能沒問題。
第三,你可以將私人資料保存在自己的儲存庫中。對於作者來說,這與第二個解決方法非常相似。但你的作者無法在不中斷跨儲存庫的歷程記錄的情況下將私人資料公開。
最後,您可以在 httpd.conf 檔案中設定第二個 <Location> 區塊,指向相同的儲存庫,但 URL 略有不同(例如,附加「-no-anon」)。在此區塊中,禁止匿名存取。然後在您的 authz 檔案中也加入一個相符的冗餘項目
[repository-no-anon:/] * = @writers = rw
現在,非寫入者匿名使用者可以從原始儲存庫 URL 簽出,而不會提示,也不會看到私人區域。非匿名寫入者可以從備用儲存庫 URL 簽出,並會提示,且會看到私人區域。(感謝 Max Bowsher 提供這個很棒的混合解決方法構想。)
C. Michael Pilato 是 Subversion 核心開發人員,也是《使用 Subversion 進行版本控制》(O'Reilly Media)的合著者,以及 ViewVC 的主要維護者。他遠距從他的家鄉北卡羅來納州工作,擔任 CollabNet 的軟體工程師,並自 2001 年初以來一直是積極的開源開發人員。Mike 是一位以身為丈夫和父親為榮的人,他熱愛旅行、足球、與家人共度美好時光,以及這些事情的任何組合。他也喜歡創作和演奏音樂,並懷抱著不那麼秘密的搖滾明星幻想。Mike 擁有北卡羅來納大學夏洛特分校的電腦科學和數學學位。