簡單記錄一下 Subversion 目錄存取權限控管的相關設定(即控制哪些人可以讀取/寫入哪些資料夾)。
Subversion 版本:CollabNet Subversion Server v1.6.5.*
Apache 的 httpd.conf 範例(不重要的部分已省略):
httpd.conf 中的 <Location> 元素的 AuthzSVNAccessFile 屬性代表目錄存取授權的控制檔。在上面的範例中,檔名是 FolderAccessControl.ini。以下是這個檔案內容的範例:
在定義資料夾的存取權限時,可指定特定使用者或群組的讀寫權限。群組名稱是以 '@ ' 字元開頭,以便和使用者名稱區別,例如 @tester = rw。等號右邊就是讀寫權限,r 代表可讀取,w 代表可寫入。如果寫 "* = r",即代表所有人都可以讀取,若等號右邊是空的,則表示既沒有讀取也沒有寫入權限,例如:"* = "(此為預設值,即如果你的權限控制檔內容是空的,任何人都無法讀/寫檔案庫的內容)。
目錄存取權限控制檔的內容如果有修改,會即時生效,不用重啟 Apache。
當使用者欲 commit 檔案時,如果她沒有寫入權限,在 commit 時就會出現錯誤:
Subversion 版本:CollabNet Subversion Server v1.6.5.*
Apache 的 httpd.conf 範例(不重要的部分已省略):
# # Dynamic Shared Object (DSO) Support # 注意以下幾個 .so 模組的載入先後順序,不可任意調換! LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /svn> DAV svn SVNParentPath d:/svn AuthType Basic AuthName "Subversion 檔案庫" #存取檔案庫時需要驗證帳號,拿掉這行就不會進行驗證 Require valid-user #驗證帳號時的帳號、密碼資料 AuthUserFile "d:/svn/SvnUsers.txt" #帳號對此檔案庫的檔案目錄存取權限 AuthzSVNAccessFile "d:/svn/FolderAccessControl.ini" </Location>這裡的身份驗證方式是採用 Basic Apache 驗證,其中的 AuthUserFile 所指向的檔案,就是使用者的帳號密碼檔,我是用一個批次檔來建立這些帳號密碼資料。批次檔的內容大概像這樣:
REM John htpasswd -c -b SvnUsers.txt john john123 REM Vivid htpasswd -b SvnUsers.txt vivid vivid123 REM Adams htpasswd -b SvnUsers.txt adams adams123
httpd.conf 中的 <Location> 元素的 AuthzSVNAccessFile 屬性代表目錄存取授權的控制檔。在上面的範例中,檔名是 FolderAccessControl.ini。以下是這個檔案內容的範例:
[groups] tester = john, vivid dev = adams, michael [MyProject:/] @dev = rw john = rw * = r [MyProject:/TestDoc] @tester = rw * =其中 [groups] 是用來定義使用者的群組(角色),這裡定義了兩個群組,分別是 dev 和 tester。之後的 [MyProject:/] 和 [MyProject:/TestDoc] 分別代表檔案庫 MyProject 的跟目錄和 TestDoc 子目錄的存取控制。要注意的是,由於我在 httpd.conf 中使用了 SVNParentPath,所以在目錄存取權限控制檔案中明確指定了檔案庫名稱(MyProject)。雖然也可以直接寫路徑名稱,例如 [/] 代表根目錄,[/TestDoc] 代表 TestDoc 子目錄,但這樣一來,如果別的檔案庫中也有相同路徑,就會套用到相同的存取權限,因而導致權限亂掉。
在定義資料夾的存取權限時,可指定特定使用者或群組的讀寫權限。群組名稱是以 '@ ' 字元開頭,以便和使用者名稱區別,例如 @tester = rw。等號右邊就是讀寫權限,r 代表可讀取,w 代表可寫入。如果寫 "* = r",即代表所有人都可以讀取,若等號右邊是空的,則表示既沒有讀取也沒有寫入權限,例如:"* = "(此為預設值,即如果你的權限控制檔內容是空的,任何人都無法讀/寫檔案庫的內容)。
目錄存取權限控制檔的內容如果有修改,會即時生效,不用重啟 Apache。
當使用者欲 commit 檔案時,如果她沒有寫入權限,在 commit 時就會出現錯誤:
error Commit failed (details follow):
error Server sent unexpected return value (403 Forbidden) in response to MKACTIVITY
error request for '/svn/MyProject/!svn/act/adeca4da-d94c-8438-6773709123ec'
error Server sent unexpected return value (403 Forbidden) in response to MKACTIVITY
error request for '/svn/MyProject/!svn/act/adeca4da-d94c-8438-6773709123ec'
還有另一種情況是,明明確定某個使用者有寫入權限,commit 時卻仍然出現上面的錯誤訊息,這很可能是因為當初 checkout 時,URL 裡面的路徑名稱的英文字母大小寫不正確。此時只要 relocate URL,將大小寫修正之後應該就能順利 commit 了。