目前網(wǎng)上找到的Subversion的配置說明中,關(guān)于用戶權(quán)限控制都是基于 Apache的User文件的或是基于 svnserve.conf文件的,這種配置方式最大的問題在于用戶信息保存在獨(dú)立的文本文件中,維護(hù)不便(對用戶的添加、修改等必須在服務(wù)器上執(zhí)行,用戶自己無法修改密碼等),并且無法和其他系統(tǒng)集成。
于是琢磨可不可以用公司現(xiàn)有的Active Directory對Subversion的用戶進(jìn)行權(quán)限控制,這樣可以解決上面提到的幾個問題。
目前已經(jīng)基本實(shí)現(xiàn)了對Subversion使用 Active Directory驗證,但是還有一些比較重要的問題沒有解決,所以是“非完美解決方案”,放在這里拋磚引玉,希望能夠有更好的解決方案。
Apache不能直接調(diào)用Active Directory的,只能通過Active Directory提供的LDAP方式進(jìn)行訪問,因此需要在 Apache中打開對LDAP的支持;
Apache中自帶了對LDAP的支持(默認(rèn)情況下沒有打開),但是官方自帶的 LDAP支持插件在Windows平臺下有問題(我這里是經(jīng)常造成 Apache異常退出,服務(wù)終止);因此在Windows平臺下需要安裝第三方的 LDAP支持插件才可以。
在網(wǎng)上找了一下,發(fā)現(xiàn)Apache的 LDAP支持模塊有以下幾個可供選擇(來源:http://nona.net/software/ldap/ ):
名稱 | 網(wǎng)址 |
mod_auth_ldap | |
mod_auth_ldap | |
auth_ldap | |
mod_auth_ldap | http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html |
mod_authz_ldap | |
mod_ldap | |
mod_ldap |
我使用的是http://www.muquit.com的 mod_auth_ldap,對其他的沒有試過。
一、 安裝(假定已經(jīng)安裝了Apache+Subversion )
1. 安裝文件的獲?。?/span>
mm_mod_auth_ldap for MS Windows binary:從 http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html 下載。
由于mm_mod_auth_ldap是基于Sun 的iPlanet C SDK 5.08開發(fā)的,運(yùn)行時還需要iPlanet C SDK 5.08的一些DLL,因此還需要自己下載 iPlanet C SDK 5.08( http://www.sun.com/download/index.jsp?cat=Application Development&tab=3,需要注冊才能下載)
2. 安裝和設(shè)置(來自http://www.chinaunix.net/jh/49/618651.html ):
1) 將上面所說的兩個壓縮包中的DLL文件復(fù)制到Apache 的modules目錄中;
2) 在httpd.conf中加入 LDAP 相關(guān)模塊的配置,就是增加如下一行:
LoadModule auth_ldap_module modules/mod_auth_ldap.dll
二、 配置
如下是httpd.conf中Subversion 段的配置,注意紅字的部分就是LDAP的配置信息,具體意義參見注釋;其他關(guān)于 Subversion和Apache的配置資料請參見網(wǎng)上相關(guān)文章(例如 http://cube316.net/blog/archives/200512/32 )。
<Location /svn>
// 常規(guī)Subversion配置
DAV svn
SVNListParentPath on
SVNParentPath D:\SVNStore
AuthType Basic
AuthName "Subversion repositories"
# 不能使用svnaccessfile進(jìn)行配置,原因見后
# AuthzSVNAccessFile conf\svnaccessfile
Require valid-user
# 以下為LDAP配置信息
# LDAP 協(xié)議版本,AD提供的LDAP為3
LDAP_Protocol_Version 3
# LDAP 服務(wù)器
LDAP_Server 192.168.1.2
# LDAP 服務(wù)器端口
LDAP_Port 389
# LDAP 基礎(chǔ)DN
Base_DN "dc=MainDC"
# AD 的 LDAP 不允許進(jìn)行匿名查詢,因此需要提供一
# 個 AD 中的用戶名及其密碼用于 Apache 的LDAP查詢
Bind_DN "cn=Administrator,cn=Users,dc=MainDC"
Bind_Pass "password"
# 供 Apache 查詢的 AD Object 的屬性
UID_Attr "sAMAccountName"
# 允許什么條件的 AD 用戶訪問 Subversion;
# 這里設(shè)置只有scmuser組的用戶才可以訪問,但是并沒
# 有成功,事實(shí)上只要是AD中的用戶現(xiàn)在都可以訪問,
# 不清楚問題出在哪里。
require group "cn=scmuser,ou=groups,dc=MainDC"
</Location>
這樣配置的意圖是允許SCMUser中所有用戶可以存取 Subversion,其他的用戶則不可以,但是事實(shí)上這樣配置以后的實(shí)際結(jié)果是AD 中所有用戶都可以訪問Subversion了,懷疑是require group中的LDAP Filter寫的不正確,但是不知道該怎么寫,目前就湊合著用了。
三、 問題
使用LDAP可以和其他系統(tǒng)比較好的集成,并且能夠方便地對用戶進(jìn)行管理,但是這種方式對于 Subversion很有問題,就是使用這種方式后無法使用AuthzSVNAccessFile 來對Subversion進(jìn)行目錄級別的權(quán)限控制,據(jù)網(wǎng)上資料說是因為 SVNAccessFile中的用戶和組都必須在User 文件中定義(參見http://svn.haxx.se/users/archive-2006-02/0586.shtml 及其相關(guān)討論),我想如果對Apache的授權(quán)模塊進(jìn)行自定義修改的話估計是可以的,不過目前我們對此要求不高,所以還暫時能夠使用。
四、參考資料
1. 《開發(fā)服務(wù)器環(huán)境配置安裝說明》(http://bbs.chinaunix.net/viewthread.php?tid=618651 )
2. 《LDAP authentication module for apache》 http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html
3. 《Subversion Users List Archives》http://svn.haxx.se/users/
Subversion是近期在開源社區(qū)中非常流行的一款版本控制軟件,它是CVS的替代產(chǎn)物。
它的主要特征有:
其他還有些零星的小功能,具體可以參閱: http://subversion.tigris.org/roadmap.html
這里解釋一下 數(shù)據(jù)倉庫 的概念:
一個數(shù)據(jù)倉庫對應(yīng)的可以是一個項目,也可以是多個項目。SVN是基于數(shù)據(jù)倉庫進(jìn)行管理的。
按照用戶習(xí)慣,可以只在每個數(shù)據(jù)倉庫內(nèi)僅放置一個項目的內(nèi)容。
Subversion 1.2.3:
http://subversion.tigris.org/project_packages.html
(SVN的Server端,分不同操作系統(tǒng)的版本,這里我下載的是for windows及for linux的)
TortoiseSVN:
http://tortoisesvn.tigris.org/download.html
(windows下的SVN客戶端,以shell方式集成在系統(tǒng)右鍵菜單中)
Apache 2.0.55:
http://httpd.apache.org/download.cgi
(視操作系統(tǒng)而下)
下面說一下安裝,分兩種平臺(windows,linux)及兩種模式(與Apache綁定 vs. Stand-alone)
具體在Apache上的配置倒是大同小異。
另外,SVN是支持SSL的,但是這個配置牽涉到其他太多東西,本文就不過多涉及了。真的有需要可以參考SVN的手冊(英文)。
方便起見,用幾個變量代表具體的值,請自行加以調(diào)整:
%SystemRoot% — windows的系統(tǒng)所在目錄,一般類似這樣:C:\WINNT
%SVN_HOME% — SVN的安裝目錄
%SVN_REPO_PARENT% — SVN所有數(shù)據(jù)倉庫的根目錄(就是存放全部版本文件的總目錄)
%PROJECT_NAME% — 項目名,嚴(yán)格的來說它對應(yīng)的是一個數(shù)據(jù)倉庫,但是這里遵從用戶習(xí)慣,以項目名稱方式來命名。
%SERVER_NAME_OR_IP% — 服務(wù)器名或IP地址
%APACHE_HOME% — Apache2的安裝路徑
另外,安裝過程默認(rèn)使用文件系統(tǒng)做后臺數(shù)據(jù)庫,文中不再加以說明。如需使用BerkeleyDB,請自行參考SVN文檔。
Windows上的服務(wù)器端安裝
____________________________________________
1.雙擊下載得來的”svn-1.2.3-setup.exe”并安裝到”%SVN_HOME%”
2.安裝完畢后,”%SVN_HOME%\bin”應(yīng)該已經(jīng)自動加入到系統(tǒng)路徑(%PATH%)中。如果沒有,請手工添加。
3.用命令行來測試安裝結(jié)果是否正確:
如果返回這樣的錯誤信息:”svnadmin.exe - Unable To Locate DLL”,那就需要嘗試一下步驟的中的一種或幾種:
安裝VC++ 6.0(主要是安裝VC的運(yùn)行庫)
或者直接從別的機(jī)器上拷貝一個”msvcp60.dll”文件到本機(jī)的”%SystemRoot%\system32″下
4.使用以下命令創(chuàng)建一個數(shù)據(jù)倉庫,用來存放項目的源代碼和其他文件:
5.其中%SVN_REPO_PARENT%是包含所有數(shù)據(jù)倉庫的目錄,%PROJECT_NAME%是所創(chuàng)建的數(shù)據(jù)倉庫對應(yīng)的項目名。
*************************
* 以 Stand-alone 模式運(yùn)行 *
*************************
6.從命令行啟動SVN Server:
注意里面的參數(shù) r 限定了瀏覽全部數(shù)據(jù)倉庫的根目錄
當(dāng)然如果覺得每次這樣啟動太麻煩的話,也有SVN Serveice的包裝程序(http://dark.clansoft.dk/~mbn/svnservice/)。通過它能夠以windows service的方式運(yùn)行SVN Server(其本質(zhì)還是Stand-alone),運(yùn)行起來相對比較方便。
7.創(chuàng)建用戶數(shù)據(jù)庫(其實(shí)就是一個txt文本,就叫它”users.conf”吧,你也可以改名),保存到
%SVN_REPO_PARENT%\%PROJECT_NAME%\conf
目錄(那個conf子文件夾在創(chuàng)建數(shù)據(jù)倉庫時已被自動創(chuàng)建好),然后在這個文件內(nèi)添加需要的用戶名和密碼?;镜臉永缦拢?/p>
注意這里密碼是明文存放的,所以也是這種方式的不足之處。
8.在”%SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目錄下找到這個”svnserve.conf”文件,用任何文本編輯器打開,為剛才創(chuàng)建的那些用戶添加讀寫權(quán)限:
里面的”users.conf”就是剛才在第7步創(chuàng)建的用戶文件。
9.最后,重啟SVN Server(什么?你不知道怎么重啟?關(guān)掉窗口再重新用命令行啟動啦;包裝成Service的話么就更加簡單了)
現(xiàn)在已經(jīng)可以使用客戶端來連接SVN Server,進(jìn)行import等操作了。
連接Server的URL應(yīng)該是類似這樣的:
具體步驟,請參閱第20步。
************************
* 以Apache的模塊方式運(yùn)行 *
************************
10.首先要了解的是SVN設(shè)計的時候只考慮了兼容Apache2.x,所以在Apache1.x下是不能正常工作的。
11.安裝Apache2
如果事先啟動了IIS之類的其他webserver,請先停止那些服務(wù)(端口被占用會導(dǎo)致Apache安裝失敗)。
其他問題可以參考Apache的安裝手冊。
這里假設(shè)安裝目錄為:%APACHE_HOME%
12.檢查Apache2的安裝是否成功
打開瀏覽器,訪問: http://localhost/
如果出現(xiàn)的是默認(rèn)的歡迎頁面,那就沒有問題了。否則請仔細(xì)檢查,重新安裝。
13.打開Apache的配置文件: “%APACHE_HOME%\conf\httpd.conf”
查找”LoadModule”這個關(guān)鍵字,找到導(dǎo)入模塊的區(qū)塊(section)
反注釋掉下面這樣,從而加載Subversion所需要的DAV模塊:
完成之后看起來應(yīng)該是這樣:
另外在這行下面再添加兩行(請注意把路徑中的”\”替換成”/”):
特別需要注意的是:由于模塊依賴關(guān)系,這三行的出現(xiàn)順序千萬不能顛倒。
14.再來配置一下”httpd.conf”的其他部分,告訴Apache2 SVN的數(shù)據(jù)倉庫所在。
(為避免不必要的麻煩,所有路徑中的”\”都請?zhí)鎿Q成”/”)
注意:
添加下述內(nèi)容:
這里涉及到兩個文件: “%SVN_REPO_PARENT%/AccessFile” 及 “%SVN_REPO_PARENT%/passwd”.
并不一定非要放到”%SVN_REPO_PARENT%”目錄下,我圖方便而已。覺得不安全可以移到另外地方。
這兩個文件里面具體內(nèi)容的設(shè)置請參考第16和17步。
15.保存”httpd.conf”并退出,這里Apache2的配置告一段落。
16.”%SVN_REPO_PARENT%/AccessFile”文件的內(nèi)容
其中:
你可以根據(jù)需要來設(shè)定不同的權(quán)限,更詳細(xì)的說明還需要參考SVN文檔中的權(quán)限設(shè)置章節(jié)。
17.”%SVN_REPO_PARENT%/passwd”文件的內(nèi)容
這個文件是通過”%APACHE_HOME%\bin\htpasswd.exe”自動生成的:
此時用文本編輯器打開”%SVN_REPO_PARENT%/passwd”,可以看到里面內(nèi)容是類似這樣的:
18.把SVN自帶的XSLT文件拷貝到網(wǎng)站根目錄,
然后設(shè)置合理權(quán)限(windows平臺則不必考慮)
19. 重啟Apache2服務(wù):
20.打開瀏覽器,訪問:http://%SERVER_NAME_OR_IP%/svn/
如果返回的頁面是”403 Forbidden”,可能是由于Apache2默認(rèn)沒有打開目錄的瀏覽權(quán)限(Option Indexes,參閱Apache2文檔),但這并不影響使用。
現(xiàn)在已經(jīng)可以用客戶端導(dǎo)入項目并開始使用了。
具體步驟,請參閱第20步。
***********************************************
* 注意:以下步驟/命令需要在裝有SVN客戶端的機(jī)器上執(zhí)行 *
* Windows下安裝服務(wù)器端的時候已經(jīng)同時安裝了客戶端 *
* Linux下尚待查證。 *
***********************************************
21.和CVS一樣,SVN在最初的時候需要將已有項目導(dǎo)入到數(shù)據(jù)庫中。
從命令行執(zhí)行以下命令(Stand-alone):
或者(Apache2 module):
其中:
A) c:\temp\myproject里面包含了你所要導(dǎo)入的項目文件的內(nèi)容
B) %SERVER_NAME_OR_IP%是SVN Server的名字或者IP地址,上面存有第5步中創(chuàng)建的數(shù)據(jù)倉庫
C) %PROJECT_NAME%是要導(dǎo)入到的數(shù)據(jù)倉庫名稱,這里選擇跟項目名一致
D) 參數(shù) m 表明此次導(dǎo)入操作的注釋,SVN的注釋是按每次提交來定義的,導(dǎo)入也是提交的一種。
E) your_username和your_password是第7和17步創(chuàng)建的用戶及密碼,注意該用戶必須對上面的%PROJECT_NAME%數(shù)據(jù)倉庫有寫權(quán)限才能成功。
22.然后,需要從Server端再次checkout到本地:
(這點(diǎn)感覺不是太方便,為啥不做成import的時候有個選項,本地目錄可以自動生成版本信息呢?)
注意:
“co”是”checkout”的一個別名
那個點(diǎn)[.]代表當(dāng)前目錄,checkout出來的文件會自動放到這個目錄下。也可以改為某個絕對路徑。
23.對于向SVN Serer增加,移動,刪除,或者修改后提交某些文件,參考使用以下命令:
對于上面的客戶端操作,如果安裝了TortoiseSVN,一切就變得簡單多了。
不過這個就要抓圖來說明了。等有空的時候再放上來。