經過一連串的測試後發現,如果我們要用同一個svnaccess來完成這個需求:
user1只能看到project1的source code而user2只能看到project2的source code
是不可能的,因為:
1.如果我們將svnaccess最上面的[/]區塊刪除時,變成如下:
[project1:/]
admin = rw
user1 = rw
user2 =rw
[project2:/]
admin = rw
user2 =rw
配合修改/etc/httpd/conf.d/subversion.conf中的設定,此時我們可以控管由網頁去存取http://localhost/svn/project1時,需要輸入帳號密碼,此時用user1可以登入。接著將網址改成http://localhost/svn/project2,此時會再要求輸入帳號及密碼,但是不論嘗試多少次,用user1都不會成功。
2.此時再用user1登入Trac的project1然後去Browse Source時就會遇到Insufficient permissions to access /的錯誤。於是我們又將[/]區塊加回去svnaccess:
[/]
admin = rw
user1 = rw
[project1:/]
admin = rw
user1 = rw
user2 =rw
[project2:/]
admin = rw
user2 =rw
此時,可以正常瀏覽source code了,但是副作用就是此時用user1將可以登入http://localhost/svn/project2(可能user2還無法登入project2)
因此,可以推論,當有設定[/]時,Apache會採用[/]區塊的設定。
此外,此時用user1登入Trac project2也可以Browse Source,所以Trac也是用[/]這邊的設定。
所以這個問題在
一個svnaccess的狀況下是無解的。
那要怎麼做到原來的需求呢?
答案應該很明顯了,就是每個Trac project使用一個svnaccess檔案,我們可以在trac.ini裡面去設定這個檔案的路徑,例如:
[trac]
authz_file = /var/trac/projects/svnaccess_project1
然後將原來的svnaccess的[/]區塊刪除,編輯svnaccess_project1如下:
admin = rw
user1 = rw
user2 =rw
最後是將Trac裡面BROWSER_VIEW從anonymous和authenticated刪除,用admin帳號登入Web介面去Admin->Permissions下執行即可,文字指令參考如下:
trac-admin /var/trac/projects/project1 permission remove anonymous BROWSER_VIEW
trac-admin /var/trac/projects/project1 permission remove authenticated BROWSER_VIEW
然後我們可以在右邊的Grant Permission:新增Subject:developer,Action: BROWSER_VIEW
然後再利用Add Subject to Group:將Subject: user1及user2陸續加到Group: developer
如此一來,我們可以確保只有加到每個Project的developer群組才能看到原始碼。
依此類推,完成project2的相關設定(trac.ini、svnaccess_project2及Permissions設定)
日後維護時,每個專案如有成員異動時,便得注意要同時修改svnaccess和svnaccess_projectX兩個檔案。