使用mod_dav_svn模塊訪問SVN倉庫方法揭祕

本節向大家簡單介紹一下使用mod_dav_svn訪問SVN倉庫的方法,主要有四個步驟,和大家一起學習一下,希望本節使用mod_dav_svn訪問SVN倉庫方法介紹對你的學習與所幫助。
在前面的日誌中,講述瞭如何使用Subversion提供的svnserve服務,通過svn://協議訪問遠端的倉庫數據。實際上,Subversion的設計包括了一個抽象的網絡層,這意味着版本庫是可以通過各種服務器進程訪問的。理論上來會說,Subversion可以使用無限數量的網絡協議來實現,甚至可以直接用perl利用相關的接口來編寫自定義協議。但日常中,用得最多的就是svn://協議,和用mod_dav_svn模塊通過Apache服務進行訪問SVN倉庫。
通過HTTP協議訪問版本庫是Subversion的亮點之一,這種方式具備許多svnserve服務器所沒有的特性,使用上更加靈活。

一、關於mod_dav_svn模塊
在介紹使用mod_dav_svn訪問SVN倉庫之前首先介紹一下mod_dav_svn模塊。由於Subversion需要版本化的控制,因此標準的HTTP協議不能滿足需求。要讓Apache與Subversion協同工作,就要使用WebDAV(Web-basedDistributedAuthoringandVersiong)Web分佈式創作和版本控制協議。WebDAV是HTTP1.1的擴展,關於WebDAV的規範和工作原理,可以參考IETFRFC2518。
mod_dav_san模塊就是作爲Subversion與Apache之間的接口,通過它,Apache就可以訪問版本庫,並且可以讓客戶端也使用HTTP的擴展協議WebDAV/DeltaV進行訪問。

二、安裝和配置
1、準備
與單純的svnserve不同,要通過Apache訪問Subversion,除了必須已經部署好Apache和Subversion的基本環境外,當然不可缺少的是mod_dav_svn模塊了:
 
引用
#rpm-qa|grepsvn
mod_dav_svn-1.4.2-2.1AX

2、創建版本倉庫
這與以前的工作是基本相同的,不同點在於,需要讓運行Apache的用戶擁有該倉庫的所有權:
 #mkdir/var/www/svn
#cd/var/www/svn/
#svnadmincreatestuff
#chown-Rapache.apachestuff/這樣,就創建了一個stuff倉庫,並讓apache稱爲該倉庫宿主。

3、修改Apache配置
mod_dav_svn訪問SVN倉庫時需要修改Apache配置,需要先激活Apache加載mod_dav_svn模塊。
修改/etc/httpd/conf.d/subversion.conf配置文件的內容爲:
#加載相應的模塊
 
引用
LoadModuledav_svn_modulemodules/mod_dav_svn.so
LoadModuleauthz_svn_modulemodules/mod_authz_svn.so
<Location/repos>
DAVsvn
SVNPath/var/www/svn/stuff
</Location>
重新啓動httpd服務後,通過瀏覽器訪問http://ip/repos,即可看到如下界面:

4、加入認證信息
mod_dav_svn訪問SVN倉庫要加入認證信息。上面定義的版本倉庫,默認是任何人都可以匿名訪問,並且擁有完全的寫入、讀取、修改、提交、刪除版本庫中信息的權限。
因此,我們需要加入認證信息以做權限的管理。HTTP協議版本就提供了簡單的客戶端認證方式,這可通過Apache配置完成。Apache提供了一個htpasswd工具來管理,使用該工具可以創建一個文件,其中存放着用戶名和加密後的密碼信息。而這些就是Subversion可以引用的用戶了,根據這些用戶信息,配合mod_authz_svn模塊即可進行目錄的訪問控制。

a、創建存放用戶名信息的文件
用htpasswd命令創建文件:

引用
#mkdir/etc/svn
#htpasswd-c/etc/svn/svnusers.conflinuxing
Newpassword:
Re-typenewpassword:
Addingpasswordforuserlinuxing
還可以利用htpasswd添加用戶,或修改密碼,刪除用戶名等:

 #htpasswd-m/etc/svn/svnusers.confNewUserName
#htpasswd-m/etc/svn/svnusers.confOldUserName
#htpasswd-D/etc/svn/svnusers.confOldUserName
-m是可選的參數,當用-c創建用戶名信息文件後,即可修改或添加用戶信息。

b、修改/etc/httpd/conf.d/subversion.conf配置文件
在配置文件的Location標籤部分,加入:
 
引用
#除了下面的動作需要認證外,其他動作不需驗證
<LimitExceptGETPROPFINDOPTIONSREPORT>
AuthTypeBasic#使用基本認證方式,即用戶名、密碼認證
AuthName"AuthorizationRealm"#在認證對話框中出現的提示信息
AuthUserFile/etc/svn/svnusers.conf#指定上面創建好的存放用戶名信息的文件路徑
Requirevalid-user#限定只有用戶輸入正確的用戶名和密碼後才能訪問該標籤所指向的路徑
</LimitExcept>
該標籤定義了,當進行除了指定的若干動作需要進行用戶名和密碼的認證後才能進行外,其他的動作是不做限制的。例如:只有認證用戶可以寫操作,同時也允許匿名的讀取操作。
也可以使用<Limit>標籤對特定的動作進行認證控制,甚至完全不用<Limit>或<LimitExcept>標籤,表示對所有的動作進行控制。此外,定義“Requirelinuxinghanry”的寫法,可實現將只有用戶信息文件中特定的linuxing和hanry用戶才能通過認證。
重啓httpd服務後,可使用瀏覽器或svn客戶端對該認證工作進行驗證。請期待下節有關使用mod_dav_svn訪問SVN倉庫內容介紹。

//上節我們介紹到了使用mod_dav_svn訪問SVN倉庫方法中第二部分,安裝配置中的加入認證信息,本文繼續介紹,另外介紹一下使用mod_dav_svn訪問SVN倉庫過程中應該注意的事項。下面是具體介紹,歡迎大家一起來學習。

5、進行目錄訪問控制
上面配置只能對Location標籤內的路徑執行某些動作時進行控制,若希望控制版本倉庫中目錄訪問權限,需要利用mod_authz_svn模塊。在上面的subversion.conf中,我們已經激活了該模塊。
所以,接下來要做的,就是在Location標籤中使用authz功能:
 
引用
AuthzSVNAccessFile/etc/svn/accesspolicy.conf
其中,AuthzSVNAccessFile指向的就是svnserve服務時使用的權限配置文件。每一段命名一個版本庫和裏面的路徑,使用“認證用戶(組)=權限”的方式描述每個用戶(組)訪問版本庫的級別:r是隻讀,rw是可讀寫,留空是不允許訪問。另外,*表示所有用戶,可以用於控制匿名用戶的訪問SVN權限;@表示已經被分組的組名。
例如:
 
引用
#cat/etc/svn/accesspolicy.conf
[groups]
committers=paul,linuxing
developers=linuxing,hanry

[/]
*=r#用於控制匿名用戶的
@committers=rw

[/dev]
@developers=rw

[/private]
*=
@comitters=r
這裏定義了兩個組,並對版本庫中的特定路徑給予了訪問權限的控制。
加入AuthzSVNAccessFile選項後,需要重啓httpd服務以讓其生效。但權限控制文件的內容修改後馬上生效,是不需重啓httpd服務。
※更詳細的說明,還可參考前面的日誌:[原]使用Subversion的svn協議訪問。下面我們看一下使用mod_dav_svn訪問SVN倉庫時要注意的幾個問題。

三、注意事項
1、如果你有多個版本倉庫,怎麼辦?
這時,可以使用多個Location,通過SVNPath來分別指定其路徑;或者,參考配置文件中提供的,用SVNParentPath指定一個總路徑,例如:
 
引用
SVNParentPath/var/www/svn
但是,你務必需要給該總路徑適當的宿主權限:
 #chown-Rapache.apache/var/www/svn
否則,訪問時會提示權限不足的錯誤。接着,你就可以使用瀏覽器訪問http://ip/repos/stuff等每個單獨的版本庫了。(每個單獨的版本庫,其Revision信息是獨立的)

◎還需要留意兩點:
a、雖然使用SVNParentPath指定了總路徑,而且用瀏覽器去訪問http://ip/repos可能會看到一些瀏覽信息。但如果總路徑並沒有加入到版本倉庫中管理(即沒有.svn目錄下的文件),則通過svn客戶端去訪問版本倉庫時,應通過實際倉庫的路徑去訪問,如:http://ip/repos/stuff;
b、使用mod_dav_svn模塊,通過Apache訪問版本倉庫,是不需要啓動svnserve服務的,一切都已經由dav模塊做接口完成數據請求的工作,通過svn客戶端以HTTP協議訪問版本倉庫即可。

2、能否通過一個權限配置文件對每個版本庫進行訪問SVN權限?
Subversion提供版本庫分支管理功能。因此,在svnserve服務,或使用mod_dav_svn模塊,使用Apache訪問Subversion版本庫時,當定義權限配置文件中,是可以對每個版本庫進行權限控制的。
以mod_dav_svn方式爲例,像上面提到的SVNParentPath來指定版本庫的總路徑,如:
 
引用
SVNParentPath=/var/www/svn
而實際上,真正的版本庫是/var/www/svn下面的一些子目錄,例如/var/www/svn/project1、/var/www/svn/project2,它們纔是由svnadmincreate創建的版本倉庫。
這時,可以在權限配置文件中,使用[repository:/path]的方式定義權限:
 
引用
[project1:/]
*=r
@project1_committer=rw
[project2:/]
*=r
@project2_committer=rw

3、Apache與svn權限控制該用哪個?
根據上面的描述,可以在Apache中使用等標籤進行權限控制,也可以激活mod_authz_svn模塊後,使用svnauthz格式的權限文件來控制。那該如何選擇呢?
事實上,它們的區別在於權限的管理者不同,對於瀏覽器或svn客戶端來說,除了Linux文件系統本身的訪問權限外,方式是讓Apache根據發送的命令進行訪問管理,svnauthz則是由mod_authz_svn來進行,它們沒有本質的區別,都可以用。
但由於對命令的控制比較複雜,而且容易導致誤操作,因此,我更建議使用svnauthz的方式管理訪問SVN權限:
 
引用

DAVsvn  SVNParentPath/var/www/svn  SatisfyAny  AuthTypeBasic  AuthName"AuthorizationRealm"  AuthUserFile/etc/svn/svnusers.conf  Requirevalid-user  AuthzSVNAccessFile/etc/svn/accesspolicy.conf  
這裏的/etc/httpd/conf.d/subversion.conf文件中,不需要加入或標籤。但加入了SatisfyAny的設置,其表示在同時啓用了Allow(允許)和Require的情況下,指定相關策略的,一共有兩個備選值,All表示用戶必須同時滿足Allow和Require的條件,而Any則是滿足其中之一即可。
這這裏,SatisfyAny用於允許先用匿名方式嘗試訪問,並根據svnauthz對匿名用戶的控制給予訪問權限。若沒有這句話,則無論svnauthz中是否加入了“*=r”的寫法,匿名用戶都是無法訪問的。

4、svn協議與mod_authz_svn模塊
svn協議,用於客戶端使用svn://方式訪問版本庫,而mod_authz_svn模塊讓客戶端可通過Apache訪問版本庫,它們分別使用不同的服務:svnserve、httpd進行訪問。由於用戶、組權限不同,權限管理方式也不相同,因此,不建議同時啓動兩種訪問方式。
而易用性,管理方便的角度來分析,Apache以,mod_authz_svn模塊的方式訪問版本庫會更多人選擇。(mod_authz_svn方式,使用80端口訪問,並且提供https等加密傳輸,用於用戶信息驗證的密碼保存方式不是明文的)。本節關於使用mod_dav_svn訪問SVN倉庫方法介紹完畢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章