6.生成身份認證文件
身份認證文件保存用戶的用戶名和密碼,用於確定用戶身份。
執行以下命令來生成身份認證文件,位於/home/svnroot/repository,文件名爲pwdfile
htpasswd -m /home/svnroot/repository/pwdfile michael
New password: *******
Re-type new password: *******
htpasswd -cm /home/svnroot/repository/pwdfile harry
New password: *****
Re-type new password: *****
htpasswd -m /home/svnroot/repository/pwdfile sally
New password: *******
Re-type new password: *******
這樣michael, harry和sally這三個用戶便被創建,其中-c表示創建身份認證文件,-m則表示密碼使用md5加密。
最後,不要忘記將pwdfile文件的所有者改爲apache,並且將其權限設爲700。
7.創建授權文件
授權文件用於確定每個用戶對特定目錄的操作權限,格式可參考版本庫下的conf/authz(conf目錄下的authz文件用於svnserve的授權,與我們所使用的mod_authz_svn的授權文件具有相同的格式)。因而我們可以直接把conf下的authz複製到我們想要的/home/svnroot/repository目錄下,然後加以修改。
這裏我麼以給test項目分配權限說明subversion的授權機制,項目的目錄結構如下圖所示:
Repository
|---test
| |---trunk
| |---branches
| |---tags
|
|---other projects…
其中,trunk表示主幹,branches則爲項目的分支,tags存放某個版本的快照。習慣上來說,大多數開發人的本地拷貝都來自truck目錄,所以每個開發人員都應有trunk目錄的讀寫權限,這樣他們才能正常的進行日常的開發;而分支目錄一般在,如某些開發人員需要大幅修改代碼以增加新功能,或者代碼進入較爲穩定的階段,開始bug去處工作等情況下使用,儘管這意味着這些代碼總是有固定的一個或幾個開發人員維護,但是基於“源代碼共同擁有”的原則,我們還是可以將其設置爲所有用戶具有讀寫權限;tags目錄則一般用於某個版本的發佈,比如當項目到達版本1834時,release1已經完成,那麼就可以將它複製到tags目錄,作爲一個快照存放,取一個好記得多的名字,比如release1(似乎應該只讓某些人有寫入權限,這樣可以防止快照被破壞,可是即使被破壞了又怎麼樣呢,不要忘了我們在使用一個版本管理軟件J)。
好吧,回過頭來看看我們已經在身份驗證文件中添加的用戶,現在我們有michael, harry和sally三個用戶,其中michael是項目的pm,harry和sally則是開發人員,那麼很明顯了,我們需要建立兩個用戶組g_pm和g_dev,michael屬於g_pm組,harry和sally則屬於g_dev組,分別授權。基於我們剛纔的分析,g_pm組和g_dev組的用戶都應該擁有對整個項目的讀寫權限,這也許太過簡單了,不過正是我們目前的項目所需要的,什麼時候需要一個複雜的授權方案,再修改authz文件也不遲。
根據authz文件的語法,我麼可以把上述的設置表達成這樣:(注意每個有效配置行的前面都不能有空格)
[groups] //羣組設置
g_pm = micheal //某羣組裏的成員
g_dev = harry,sally
[test:/] //倉庫test的根目錄的訪問權限
@g_pm = r //g_pm組用戶具有讀和寫權限,’@’開頭的表示羣組設置
@g_dev = r //g_dev用戶具有讀寫權限
[test:/trunk] //倉庫test的trunk目錄的訪問權限
@g_pm = rw //g_pm組用戶具有讀和寫權限,’@’開頭的表示羣組設置
@g_dev = rw //g_dev用戶具有讀寫權限
[test:/branches] //倉庫test的branches目錄下的訪問權限
@g_pm = rw //g_pm組用戶具有讀和寫權限,’@’開頭的表示羣組設置
@g_dev = rw //g_dev用戶具有讀寫權限
[test:/tags] //倉庫test的tags目錄下的訪問權限
@g_pm = rw //g_pm組用戶具有讀和寫權限,’@’開頭的表示羣組設置
@g_dev = rw //g_dev用戶具有讀寫權限
如果需要對某個用戶授權,可以這麼寫:
[test:/branches] //倉庫test的branches目錄下的訪問權限
sally = r //sally用戶具有讀權限
當然,這樣的authz文件顯得很繁瑣,而且沒有必要,但是這樣的配置在需求出現變化的時候將會很容易修改。
不要忘記將authz文件的所有者改爲apache,並且將其權限設爲700。
8.修改Apache配置文件
執行vi /usr/local/apache2/conf/httpd.conf
確保以下兩行已被subversion正確添加,這樣apache才能正確加載module。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Version Control with Subversion 1.4以及很多howto上提到的
LoadModule dav_module modules/mod_dav.so
我們已經在編譯httpd時鏈接進了核心中,不需要作爲共享對象加載。
接着,在httpd.conf的最後添加以下內容(不包括後面的註釋)
<Location /svn>
DAV svn
SVNParentPath /home/svnroot/repository/ //svn父目錄
AuthType Basic //客戶端認證機制
AuthName "Subversion Repository" //認證域名稱
AuthUserFile /home/svnroot/repository/pwdfile //身份認證文件
AuthzSVNAccessFile /home/svnroot/repository/authz //權限配置文件
Satisfy Any //先嚐試匿名訪問
Require valid-user //僅通過驗證的用戶可訪問版本庫
</Location>
其中/svn表示一個url的模式,匹配形如http://host/svn的url;SVNParentPath 指定的目錄下的所有項目都被subversion 認爲是合法的版本庫;AuthzSVNAccessFile爲授權文件 ;AuthType 則制定了客戶端身份認證機制,Basic表示http基本認證機制;AuthUserFile就是先前創建的密碼文件;Satisfy Any 和Require valid-user告訴apache所有用戶先使用匿名方式訪問版本庫,只有當訪問控制策略要求一個真實的用戶名時,apache纔會對客戶端進行身份驗證,這是使用得最多的一種授權方式。
最後,使用如下命令重啓apache httpd,打開瀏覽器訪問http://localhost/svn/test/這個URL便可訪問版本庫了,當然,受權限的限制,必須是合法用戶才能訪問且具有相應的權限的目錄。
/usr/local/apache2/bin/apachectl restart
至此,我們的版本庫已經進行了正確的身份認證和授權配置,並且用戶可以通過瀏覽器來查看當前的版本庫的情況,subversion已經處於可用的狀態。接下來的一篇中,我們將討論使用subversion客戶端相關的問題以及如何將subversion和apache httpd配置爲系統服務。
Reference
1. Subversion之路--實現精細的目錄訪問權限控制 鄭新星
2. Version Control with Subversion 1.4(r2730) Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato
3. Apache HTTP Server Version 2.2文檔中文版 Apache Software Foundation 金步國譯
4. 在Redhat9 Linux下安裝,配置Subversion 1.3.1 Wooin http://blog.csdn.net/wooin/archive/2006/07/11/903974.aspx