目 錄
1 前言
1.1 Subversion 權(quán)限簡(jiǎn)介
1.2 其他信息
2 致謝
3 實(shí)戰(zhàn)
3.1 背景假設(shè)
3.2 使用 svnserve.exe 作為 Subversion 服務(wù)器
3.2.1 啟動(dòng) Subversion 服務(wù)
3.2.2 建立代碼庫(kù)
3.2.3 編輯代碼庫(kù)基礎(chǔ)配置文件
3.2.4 管理用戶帳號(hào)
3.2.5 建立目錄訪問權(quán)限控制文件
3.2.6 導(dǎo)入代碼
3.2.7 測(cè)試
4 深入
4.1 svnserve.conf
4.2 authz.conf 之用戶分組
4.3 authz.conf 之項(xiàng)目根目錄
4.4 authz.conf 之項(xiàng)目子目錄
4.5 authz.conf 之目錄表示法
4.6 authz.conf 的其他注意點(diǎn)
5 改進(jìn)
5.1 對(duì)中文目錄的支持
6 參考文獻(xiàn)
7 歷史軌跡
1 前言
1.1 Subversion 權(quán)限簡(jiǎn)介在 Subversion 的使用當(dāng)中,存在“認(rèn)證”、“授權(quán)”兩個(gè)概念。認(rèn)證,即 authentication,是指用戶名與密碼的認(rèn)證。授權(quán),即 authorization ,是指某用戶對(duì)某個(gè)目錄是否具備讀、寫權(quán)限的一種審核。這兩者配合作用,就組成了 Subversion 的整個(gè)帳戶管理體系。
在實(shí)際的工作當(dāng)中,我們有時(shí)候會(huì)遇見需要控制項(xiàng)目目錄的訪問權(quán)限的情況,比如說對(duì)項(xiàng)目的一些關(guān)鍵模塊進(jìn)行限制,僅允許少數(shù)授權(quán)人士才可以修改等。由于項(xiàng)目的目錄本身就是作為版本庫(kù)的一個(gè)部分被 Subversion 所收管,所以我們無法利用操作系統(tǒng)的帳戶權(quán)限體系,來實(shí)現(xiàn)授權(quán)控制。因此,這個(gè)問題就只有讓svn自己來解決了。
Subversion 提供了面向目錄的帳戶權(quán)限管理功能,通過它,我們就可以很精確地實(shí)現(xiàn)項(xiàng)目目錄的訪問控制。不過在 1.2 及其以前的版本,我們只能利用 mod_authz_svn.so 模塊,結(jié)合 Apache 服務(wù)器來實(shí)現(xiàn)目錄訪問控制,這對(duì)于對(duì) Apache 的配置與使用不是很熟悉的人來說,就不是很方便了。而Subversion終于在 1.3 版本上,在 svnserve.exe 服務(wù)器里面添加了這一功能,方便了很多人。
1.2 其他信息本文面向那些 Subversion 的管理員,或者任何對(duì) Subversoin 有興趣的人們。本文假定讀者對(duì)Subversion有一定的了解,因此不打算對(duì)所有涉及到的安裝、使用,做一個(gè)細(xì)節(jié)性的描述。若對(duì)于文章中描述的其他細(xì)節(jié)方面有所疑問,請(qǐng)?jiān)L問“參考文獻(xiàn)”一節(jié)里面的參考資料。如果你對(duì)本文任何地方有什么意見,或者發(fā)現(xiàn)本文有著大大小小的錯(cuò)誤,請(qǐng)聯(lián)系 zhengxinxing <AT> gmail <DOT> com 。
本文是基于 Subversion 1.3.2、MS Windows 2003 Server Edition 平臺(tái)來編寫的,且 Subversion 服務(wù)器是利用 svnserve.exe 來架設(shè)的。不過,本文講述到的絕大多數(shù)內(nèi)容,都是不僅與操作系統(tǒng)平臺(tái)無關(guān),而且與是采用 svnserve(.exe) 還是使用 Apache 來作為 Subversion 服務(wù)器也基本無關(guān)。因此為免羅嗦,本文就以 svnserve(.exe) 為例進(jìn)行描述,而略過 Apache 服務(wù)器相關(guān)的內(nèi)容,有興趣的讀者可以參考其他文章來在 Apache 服務(wù)器下實(shí)現(xiàn)類似的功能。
本文是利用 reST 格式來編寫的,如果你對(duì)它感興趣,請(qǐng)?jiān)L問 http://docutils.sourceforge.net/rst.html 。如果想要看到更好的html格式,你可以通篇復(fù)制本文到一個(gè)文本文件里,然后利用 docutils 的 rst2html.py 腳本編譯它,當(dāng)然,首先你必須安裝 python。
本文的獲得方式:
原始發(fā)布點(diǎn): http://iusesvn.com/bbs/thread-6-1-1.html
完整源文件,請(qǐng)利用 svn 命令來獲取,命令為 svn co svn://cvs.woodpecker.org.cn/woodpecker/zqlib/tangle/michael.zheng/road2svn
HTML版式文件,請(qǐng)?jiān)L問 http://zhengxinxing.googlepages.com/The.Road.to.Subversion_authz.html (推薦)或 http://swjr.blog.com.cn/archives/2006/TheRoadToSubversion1authz.shtml 。
2 致謝非常感謝 iusesvn.com 站的站長(zhǎng) PCplayer ,他在本文編寫過程中,給我提出了很多寶貴的意見與建議。
感謝 woodpecker.org.cn 提供的 Subversion 空間,讓更多的人可以通過 svn 獲得本文件。
感謝 google 公司提供的免費(fèi)主頁(yè)空間,讓我可以放置完全定制的 HTML 文件。
3 實(shí)戰(zhàn)本章先直接給出需求及其最終的結(jié)果,如果你覺得對(duì)配置有什么疑問,或者看不懂,請(qǐng)不要著急,我會(huì)在后面的章節(jié)詳細(xì)描述的。
3.1 背景假設(shè)廈門央瞬公司是一家電子元器件設(shè)備供應(yīng)商,其中有個(gè)ARM部門,專門負(fù)責(zé)ARM芯片的方案設(shè)計(jì)、銷售,并在北京、上海各設(shè)立了一個(gè)辦事處。對(duì)于工作日志,原先采用郵件方式發(fā)給經(jīng)理,但是這種方式有個(gè)缺點(diǎn),那就是不具備連續(xù)性,要看以前的日志必須一封一封郵件去查看,很麻煩。于是就想到利用 Subversion, 讓員工在自己電腦上編輯日志,然后利用svn傳送回來,既方便員工自己編寫日志,又方便對(duì)日志的歸檔處理,而且提交日志的時(shí)候只需要執(zhí)行一下 svn commit 即可,比發(fā)送郵件還要簡(jiǎn)單的多。
svn服務(wù)器相關(guān)信息
服務(wù)器地址: 192.168.0.1
服務(wù)器OS: MS Windows 2000 Server Edition 中文版
用于存放日志的代碼庫(kù)本地目錄: D:\svn\arm
arm部門文檔的目錄結(jié)構(gòu)如下:
arm 部門名稱
├─diary 工作日志目錄
│ ├─headquarters 總部工作日志目錄
│ ├─beijing 北京辦日志目錄
│ └─shanghai 上海辦日志目錄
├─ref 公司公共文件參考目錄
└─temp 臨時(shí)文件目錄
人員情況
morson,公司總經(jīng)理,不習(xí)慣使用電腦,更喜歡傳統(tǒng)的紙與筆,以及面對(duì)面的交流
michael,arm事業(yè)部的部門經(jīng)理,沒事的時(shí)候喜歡弄點(diǎn)兒新技術(shù),用svn來管理日志,就是他想出來的主意
scofield,北京辦人員,老員工,為人油滑難管
lincon,上海辦人員,老員工,大老實(shí)人一個(gè)
linda,總部協(xié)調(diào)員、秘書,文筆不錯(cuò),長(zhǎng)得也不錯(cuò)
rory,單片機(jī)技術(shù)員,技術(shù)支持
訪問權(quán)限需求分析
允許總經(jīng)理、部門經(jīng)理讀取所有文件。順便給他們開放寫權(quán)限,以便體現(xiàn)對(duì)他們職位的尊重,雖然對(duì)于某些文件來說,他們?nèi)魮碛?#8220;寫”權(quán)限其實(shí)也沒什么用處
除部門經(jīng)理外,所有其他人員,均只能看到本辦事處人員工作日志
不允許匿名訪問
ref目錄只允許經(jīng)理和秘書讀寫,對(duì)其他人只讀
temp目錄人人都可以隨意讀寫
3.2 使用 svnserve.exe 作為 Subversion 服務(wù)器本節(jié)描述如何利用 svnserve.exe 來作為代碼庫(kù)服務(wù)器端,實(shí)現(xiàn)上述功能。至于另外一種代碼庫(kù)服務(wù)器端,即利用 Apache 結(jié)合 mod_dav_svn.so 來實(shí)現(xiàn)的代碼庫(kù)服務(wù)器端,由于其對(duì)于本文敘述的內(nèi)容“實(shí)現(xiàn)精細(xì)的目錄訪問權(quán)限控制”而言,與前者沒有太大的區(qū)別,故而略過不提。它們二者只是在初次安裝、配置方面存在一些不同,有興趣的讀者,可以參考其他文檔,重新實(shí)驗(yàn)下述步驟。
3.2.1 啟動(dòng) Subversion 服務(wù)
在服務(wù)器端,打開一個(gè)命令行窗口,用CD命令進(jìn)入 Subversion 安裝目錄下的 bin 目錄,運(yùn)行如下指令:
svnserve -d -r d:\svn
其中的 -d 參數(shù)表示 svnserve.exe 將會(huì)作為一個(gè)服務(wù)程序運(yùn)行在后臺(tái),而 -r 參數(shù)表示將 D:\svn 目錄指定為代碼庫(kù)的根目錄。這樣,當(dāng)客戶端使用類似 svn://192.168.0.1/foo 這樣內(nèi)容的 URL 來訪問服務(wù)器時(shí)候,其所訪問到的真實(shí)代碼庫(kù),其實(shí)就是 D:\svn\foo
用上述命令行方式啟動(dòng)的 svn 服務(wù)有個(gè)小缺點(diǎn),就是在本試驗(yàn)過程中,服務(wù)器端必須要一直開著那個(gè)運(yùn)行了上述命令的DOS窗口,不能關(guān)閉它。如果不想看到這個(gè)窗口,可以將 svnserve 安裝成 windows 的一個(gè) services,安裝方式請(qǐng)參考其他文章。
3.2.2 建立代碼庫(kù)
在服務(wù)器端的 D:\svn 目錄下,建立一個(gè)名為 arm 的代碼庫(kù),命令如下:
D:\svn>svnadmin create arm
使用上述命令之后,如果不出問題的話,在 D:\svn 目錄下就會(huì)多出一個(gè)叫做 arm 的目錄,其下具備 conf、dav、hooks、locks、db 等子目錄或文件,此即 一個(gè)名為arm的代碼庫(kù) 。從此,通過 svn://192.168.0.1/arm 這樣的 URL,我們就可以對(duì)這個(gè)代碼庫(kù)進(jìn)行訪問了。接下來就要進(jìn)入本文的正題了,也就是權(quán)限配置部分了。
其實(shí)進(jìn)入 arm\conf 目錄你就會(huì)發(fā)現(xiàn),它下面已經(jīng)存在三個(gè)寫了一些幫助信息和示例的配置文件,以幫助用戶盡早掌握其配置方法。這三個(gè)默認(rèn)的配置文件分別是 svnserve.conf、passwd、authz 。其中后兩者沒有后綴,對(duì)于 windows 系統(tǒng)的用戶來說,看起來總是有些怪異,所以在接下來的章節(jié)里面,我將它們兩個(gè)都給添加了個(gè) conf 后綴,以便管理。
3.2.3 編輯代碼庫(kù)基礎(chǔ)配置文件
在服務(wù)器端,編輯代碼庫(kù)的 arm\conf\svnserve.conf 文件,如下:
[general]
password-db = passwd.conf
anon-access = none
auth-access = write
authz-db = authz.conf
3.2.4 管理用戶帳號(hào)
在服務(wù)器端,新建 arm\conf\passwd.conf 文件,如下:
[users]
morson = ShowMeTheMoney
michael = mysecretpassword
scofield = hellolittilekiller
lincon = asyouknows111
rory = 8809117
linda = IlikeWorldCup2006
3.2.5 建立目錄訪問權(quán)限控制文件
在服務(wù)器端,新建 arm\conf\authz.conf 文件,內(nèi)容如下:
[groups]
g_vip = morson
g_manager = michael
g_beijing = scofield
g_shanghai = lincon
g_headquarters = rory, linda
g_docs = linda
[arm:/]
@g_manager = rw
* = r
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
[arm:/diary/beijing]
@g_manager = rw
@g_beijing = rw
@g_vip = r
* =
[arm:/diary/shanghai]
@g_manager = rw
@g_shanghai = rw
@g_vip = r
* =
[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r
[arm:/temp]
* = rw
3.2.6 導(dǎo)入代碼
在客戶機(jī) F:\temp 目錄下,建立好前述“背景假設(shè)”一節(jié)中描述的目錄結(jié)構(gòu),然后用命令 F:\temp>svn import arm svn://192.168.0.1/arm --username michael --password mysecretpassword 導(dǎo)入整個(gè)目錄結(jié)構(gòu)。
這條指令的精確意思是,將 arm 目錄下面的所有東西,導(dǎo)入到那個(gè)名叫 arm 的代碼庫(kù)中去。如果你不指定源目錄,則 svn 會(huì)默認(rèn)將當(dāng)前目錄作為源目錄。比如說,你處于 F:\temp 目錄下的時(shí)候,直接執(zhí)行 svn import svn://192.168.0.1/arm ,那么當(dāng)你取出你的代碼的時(shí)候,你會(huì)發(fā)現(xiàn),居然多了一層名為 arm 的目錄。結(jié)果,你就必須使用類似 svn://192.168.0.1/arm/arm 這樣怪異的URL,才能夠正確訪問到你的代碼們。
這一點(diǎn)粗看好像不是特別重要,不過聯(lián)想到前述的目錄授權(quán)規(guī)則,可都是按照標(biāo)準(zhǔn)的項(xiàng)目目錄結(jié)構(gòu)來設(shè)計(jì)的。突然之間,你項(xiàng)目的根目錄之上,多出了一個(gè)名為 arm 的目錄,那么我們的所有目錄授權(quán)規(guī)則,基本上都要全部改過了,否則除了根目錄,你永遠(yuǎn)會(huì)得到一個(gè)莫名其妙的“access denied”。由于 Subversion 在這一步驟上的界面不夠人性化,因此這是初學(xué)者很容易弄混的地方之一。
3.2.7 測(cè)試
在服務(wù)器上,打開一個(gè) DOS Prompt 窗口,輸入如下指令:
svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
我們應(yīng)該得到如下目錄結(jié)構(gòu):
arm
├─diary
│ └─headquarters
├─ref
└─temp
然后修改ref目錄下任意文件并提交,服務(wù)器將會(huì)報(bào)錯(cuò)“Access denied”,Bingo!
4 深入本章將詳細(xì)介紹前一章所涉及的兩個(gè)配置文件, svnserve.conf 和 authz.conf,通過對(duì)配置逐行的描述,來闡明其中的一些細(xì)節(jié)含義。除此之外的其他配置、安裝等內(nèi)容,不是本文重點(diǎn),讀者若有什么疑問,請(qǐng)參考后面“參考文獻(xiàn)”中列出的一些文檔。
這里首先要注意一點(diǎn),任何配置文件的有效配置行,都 不允許存在前置空格 ,否則程序可能會(huì)出錯(cuò),給你一個(gè) Option expected 的提示。也就是說,如果你直接從本文的純文本格式中拷貝了相關(guān)的配置行過去,需要手動(dòng)將前置的4個(gè)空格全部刪除。當(dāng)然了,如果你覺得一下子要?jiǎng)h除好多行的同樣數(shù)目的前置空格是一件苦差使,那么也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助。
4.1 svnserve.confarm\conf\svnserve.conf 文件,是 svnserve.exe 這個(gè)服務(wù)器進(jìn)程的配置文件,我們逐行解釋如下。
首先,我們告訴 svnserve.exe,用戶名與密碼放在 passwd.conf 文件下。當(dāng)然,你可以改成任意的有效文件名,比如默認(rèn)的就是 passwd:
password-db = passwd.conf
接下來這兩行的意思,是說只允許經(jīng)過驗(yàn)證的用戶,方可訪問代碼庫(kù)。 那么哪些是“經(jīng)過驗(yàn)證的”用戶呢?噢,當(dāng)然,就是前面說那些在 passwd.conf 文件里面持有用戶名密碼的家伙。這兩行的等號(hào)后面,目前只允許 read write none 三種值,你如果想實(shí)現(xiàn)一些特殊的值,比如說“read-once”之類的,建議你自己動(dòng)手改源代碼,反正它也是自由軟件:
anon-access = none
auth-access = write
接下來就是最關(guān)鍵的一句呢,它告訴 svnserve.exe,項(xiàng)目目錄訪問權(quán)限的相關(guān)配置是放在 authz.conf 文件里:
authz-db = authz.conf
當(dāng)然,svn 1.3.2 引入本功能的時(shí)候,系統(tǒng)默認(rèn)使用 authz 而不是 authz.conf 作為配置文件。不過可能由于鄙人是處女座的,據(jù)說有著強(qiáng)烈的完美主義情結(jié),看著 svnserve.conf 有后綴而 passwd 和 authz 沒有就是不爽,硬是要改了。
上述的 passwd.conf 和 authz.conf 兩個(gè)文件也可以作為多個(gè)代碼庫(kù)共享使用,我們只要將它們放在公共目錄下,比如說放在 D:\svn 目錄下,然后在每個(gè)代碼庫(kù)的 svnserve.conf 文件中,使用如下語(yǔ)句:
password-db = ..\..\passwd.conf
authz-db = ..\..\authz.conf
或者:
password-db = ../../passwd.conf
authz-db = ../../authz.conf
這樣就可以讓多個(gè)代碼庫(kù)共享同一個(gè)用戶密碼、目錄控制配置文件,這在有些情況下是非常方便的。
4.2 authz.conf 之用戶分組arm\conf\authz.conf 文件的配置段,可以分為兩類, [group] 是一類,里面放置著所有用戶分組信息。其余以 [arm:/] 開頭的是另外一類,每一段就是對(duì)應(yīng)著項(xiàng)目的一個(gè)目錄,其目錄相關(guān)權(quán)限,就在此段內(nèi)設(shè)置。
首先,我們將人員分組管理,以便以后由于人員變動(dòng)而需要重新設(shè)置權(quán)限時(shí)候,盡量少改動(dòng)?xùn)|西。我們一共設(shè)置了5個(gè)用戶分組,分組名稱統(tǒng)一采用 g_ 前綴,以方便識(shí)別。當(dāng)然了,分組成員之間采用逗號(hào)隔開:
[groups]
# 任何想要查看所有文檔的非本部門人士
g_vip = morson
# 經(jīng)理
g_manager = michael
# 北京辦人員
g_beijing = scofield
# 上海辦人員
g_shanghai = lincon
# 總部一般員工
g_headquarters = rory, linda
# 小秘,撰寫文檔
g_docs = linda
注意到?jīng)]有, linda 這個(gè)帳號(hào)同時(shí)存在“總部”和“文檔員”兩個(gè)分組里面,這可不是我老眼昏花寫錯(cuò)了,是因?yàn)?Subversion 允許我這樣設(shè)置。它意味著,這個(gè)家伙所擁有的權(quán)限,將會(huì)比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請(qǐng)往下看!
4.3 authz.conf 之項(xiàng)目根目錄接著,我們對(duì)項(xiàng)目根目錄做了限制,該目錄只允許arm事業(yè)部的經(jīng)理才能修改,其他人都只能眼巴巴的看著:
[arm:/]
@g_manager = rw
* = r
[arm:/] 表示這個(gè)目錄結(jié)構(gòu)的相對(duì)根節(jié)點(diǎn),或者說是 arm 項(xiàng)目的根目錄。其中的 arm 字樣,其實(shí)就是代碼庫(kù)的名稱,即前面用 svnadmin create 命令創(chuàng)建出來的那個(gè) arm。
這里的 @ 表示接下來的是一個(gè)組名,不是用戶名。因?yàn)槟壳?g_manager 組里面只有一個(gè) michael,你當(dāng)然也可以將 @g_manager = rw 這一行替換成 michael = rw ,而表達(dá)的意義完全一樣。
* 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部門經(jīng)理外的其他所有人”,當(dāng)然也包括總經(jīng)理那個(gè)怪老頭
* = r 則表示“那些人只能讀,不能寫”
4.4 authz.conf 之項(xiàng)目子目錄然后,我們要給總部人員開放日志目錄的讀寫權(quán)限:
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
這個(gè)子目錄的設(shè)置有些特色,因?yàn)閺男枨蠓治鲋形覀冎?,這個(gè)子目錄的權(quán)限范圍要比其父目錄小,它不允許除指定了的之外其他任何人訪問。在這段設(shè)置中,我們需要注意以下幾點(diǎn):
我敢打賭,設(shè)計(jì)svn的家伙們,大部分都是在類 unix 平臺(tái)下工作,所以他們總喜歡使用 / 來標(biāo)識(shí)子目錄,而完全忽視在 MS Windows 下是用 \ 來做同樣的事情。所以這兒,為了表示 diary\headquarters 這個(gè)目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。當(dāng)然如果你一定要用 \ ,那么唯一的結(jié)果就是,Subversion 會(huì)將你的這部分設(shè)置置之不理,全當(dāng)沒看到。
這里最后一行的 * = 表示,除了經(jīng)理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?不行,因?yàn)?權(quán)限具備繼承性 ,子目錄會(huì)自動(dòng)擁有父目錄的權(quán)限。若沒有這一行,則所有帳號(hào)都可以讀取 /diary/headquarters 目錄下的文件。因?yàn)殡m然我們并沒有設(shè)置這個(gè)目錄的父目錄權(quán)限,可是默認(rèn)的規(guī)則使得 /diary 目錄的權(quán)限與根目錄完全一樣,從而讓其余帳號(hào)獲得對(duì) /diary/headquarters 目錄的 r 權(quán)限。所以簡(jiǎn)單來說, * = 這一句的目的,就是割斷權(quán)限繼承性,使得管理員可以定制某個(gè)目錄及其子目錄的權(quán)限,從而完全避開其父目錄權(quán)限設(shè)置的影響。
之所以這兒需要將 @g_vip = r 一句加上,就是因?yàn)榇嬖谏鲜鲞@個(gè)解釋。如果說你沒有明確地給總經(jīng)理授予讀的權(quán)力,則他會(huì)和其他人一樣,被 * = 給排除在外。
如果眾位看官中間,有誰玩過防火墻配置的話,可能會(huì)感覺上述的配置很熟悉。不過這里有一點(diǎn)與防火墻配置不一樣,那就是各個(gè)配置行之間,沒有 先后順序 一說。也就是說,如果我將本段配置的 * = 這一行挪到最前面,完全不影響整個(gè)配置的最終效果。
接下來我們看看這一段:
[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r
這里的主要看點(diǎn),就是 g_docs 組里面包含了一個(gè) linda 帳號(hào),她也同時(shí)在 g_headquarters 組里面出現(xiàn),這就意味著, linda 將具備對(duì) /ref 和 diary\headquarters 兩個(gè)目錄的讀寫權(quán)限。
4.5 authz.conf 之目錄表示法在前面的描述中,我們都采用 [repos:/some/dir] 這樣的格式來表示項(xiàng)目的某個(gè)目錄,比如上一小節(jié)中的 [arm:/diary/headquarters] 。而實(shí)際上,Subversion 允許你采用 `[/some/dir] 這樣的格式,即不指定代碼庫(kù)的方式來表示目錄,此時(shí)的目錄就匹配所有項(xiàng)目。
對(duì)于使用 svnserve 的用戶來說,只有當(dāng) svnserve 運(yùn)行的時(shí)候使用了 -r 參數(shù),并且讓多個(gè)代碼庫(kù)共享同一個(gè)目錄權(quán)限文件(即 authz.conf 或 authz)時(shí),不指明代碼庫(kù)名稱才有可能惹麻煩。一般情況下,我們對(duì)每個(gè)代碼庫(kù)都會(huì)獨(dú)立使用配置文件,畢竟每個(gè)項(xiàng)目的目錄結(jié)構(gòu),都有很大不同,混在一起意義不大。因此一般來說,為簡(jiǎn)潔起見,都可以不指明代碼庫(kù)名稱。本文全都指明了代碼庫(kù)名稱,主要是為了將來擴(kuò)展成同一個(gè)配置文件,以方便配合 Apache 服務(wù)器。
對(duì)于使用 Apache 的用戶來說,它們二者可有著很大的不同,因?yàn)榇藭r(shí)往往習(xí)慣于使用一個(gè)公共的目錄權(quán)限配置文件。如果你使用了 SVNParentPath 指令,則指定版本庫(kù)的名字是很重要的,因?yàn)榧偃裟闶褂煤笳撸敲?[/some/dir] 部分就會(huì)與所有代碼庫(kù)項(xiàng)目的 [/some/dir] 目錄匹配。如果你使用 SVNPath 指令,則這兩種表示方式就沒有什么區(qū)別了,畢竟只有一個(gè)版本庫(kù)。
4.6 authz.conf 的其他注意點(diǎn)父目錄的 r 權(quán)限,對(duì)子目錄 w 權(quán)限的影響
把這個(gè)問題專門提出來,是因?yàn)樵?.3.1及其以前的版本里面,有個(gè)bug,即某個(gè)帳號(hào)為了對(duì)某個(gè)子目錄具備寫權(quán)限,則必須對(duì)其父目錄具備讀權(quán)限。因此現(xiàn)在使用了1.3.2及其更高的版本,就方便了那些想在一個(gè)代碼庫(kù)存放多個(gè)相互獨(dú)立的項(xiàng)目的管理員,來分配權(quán)限了。比如說央舜公司建立一個(gè)大的代碼庫(kù)用于存放所有員工日志,叫做 diary,而arm事業(yè)部只是其中一個(gè)部門,則可以這樣做:
[diary:/]
@g_chief_manager = rw
[diary:/arm]
@g_arm_manager = rw
@g_arm = r
這樣,對(duì)于所有arm事業(yè)部的人員來說,就可以將 svn://192.168.0.1/diary/arm 這個(gè)URL當(dāng)作根目錄來進(jìn)行日常操作,而完全不管它其實(shí)只是一個(gè)子目錄,并且當(dāng)有少數(shù)好奇心比較強(qiáng)的人想試著 checkout 一下 svn://192.168.0.1/diary 的時(shí)候,馬上就會(huì)得到一個(gè)警告“Access denied”,哇,太酷了。
默認(rèn)權(quán)限
如果說我對(duì)某個(gè)目錄不設(shè)置任何權(quán)限,會(huì)怎樣?馬上動(dòng)手做個(gè)試驗(yàn),將:
[diary:/]
@g_chief_manager = rw
改成:
[diary:/]
# @g_chief_manager = rw
這樣就相當(dāng)于什么都沒有設(shè)置。在我的 svn 1.3.2 版本上,此時(shí)是禁止任何訪問。也就是說,如果你想要讓某人訪問某目錄,你一定要顯式指明這一點(diǎn)。這個(gè)策略,看起來與防火墻的策略是一致的。
只讀權(quán)限帶來的一個(gè)小副作用
若設(shè)置了:
[arm:/diary]
* = r
則 Subversion 會(huì)認(rèn)為,任何人都不允許改動(dòng) diary 目錄,包括刪除、 改名 ,和 新增 。
也就是說,如果你在項(xiàng)目初期創(chuàng)建目錄時(shí)候,一不小心寫錯(cuò)目錄名稱,比如因拼寫錯(cuò)誤寫成 dairy,以后除非你改動(dòng) authz.conf 里面的這行設(shè)置,否則無法利用 svn mv 命令將錯(cuò)誤的目錄更正。
anon-access 屬性對(duì)目錄權(quán)限的影響
你想將你的代碼庫(kù)開放給所有人訪問,于是你就開放了匿名訪問權(quán)限,在 svnserve.conf 文件中添加一行: anon-access=read ??墒菍?duì)于部分目錄,你又不希望別人看到,于是針對(duì)那些特別目錄,你在 authz.conf 里面進(jìn)行配置,添加了授權(quán)訪問的人,并添加了 * = 標(biāo)記。你認(rèn)為一切OK了,可是你缺發(fā)現(xiàn),那個(gè)特別目錄卻無法訪問了,總是提示 Not authorized to open root of edit operation 或者 未授權(quán)打開根進(jìn)行編輯操作 。你再三檢查你配置的用戶名與密碼,確認(rèn)一切正確,還是無法解決問題。
原來,Subversion 有個(gè)小 bug ,當(dāng) anon-access=read 并且某個(gè)目錄有被設(shè)置上 * = 標(biāo)記,則會(huì)出現(xiàn)上述問題。這個(gè) bug 在當(dāng)前最新版本上(v1.4)還存在,也許在下一版本內(nèi)可以被改正吧。
解決的辦法是,在 svnserve.conf 中,將 anon-access 設(shè)置成 none 。
5 改進(jìn)5.1 對(duì)中文目錄的支持上午上班的時(shí)候,Morson 來到 Michael 的桌子前面,說道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺得很難受?” Michael 心想,還好這兩天剛了解了一些與 unicode 編碼相關(guān)的知識(shí),于是微笑地回答:“當(dāng)然可以,你明天下午就可以看到中文目錄名稱了。”
使用 svn mv 指令,將原來的一些目錄改名并 commit 入代碼庫(kù),改名后的目錄結(jié)構(gòu)如下:
arm
├─工作日志
│ ├─總部人員
│ ├─北京辦
│ └─上海辦
├─公司公共文件參考目錄
└─臨時(shí)文件存放處
修改代碼庫(kù)的 authz.conf 文件,將相應(yīng)目錄逐一改名
UTF-8 格式的 authz.conf 文件,以及 BOM
將配置文件轉(zhuǎn)換成 UTF-8 格式之后,Subversion 就能夠正確識(shí)別中文字符了。但是這里需要注意一點(diǎn),即必須保證 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的縮寫,指 UNICODE 文件頭部用于指明高低字節(jié)排列順序的幾個(gè)字符,通常是 FF FE ,而將之用 UTF-8 編碼之后,就是 EF BB BF 。由于 UTF-8 文件本身不存在字節(jié)序問題,所以對(duì) UTF-16 等編碼方式有重大意義的 BOM,對(duì)于 UTF-8 來說,只有一個(gè)作用——表明這個(gè)文件是 UTF-8 格式。由于 BOM 會(huì)給文本處理帶來很多難題,所以現(xiàn)在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。
目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”里面,“另存為”菜單保存出來的 UTF-8 格式文件,會(huì)自動(dòng)帶上 BOM 。新版本 UltraEdit 提供了選項(xiàng),允許用戶選擇是否需要 BOM,而老版本的不會(huì)添加 BOM。請(qǐng)各位查看一下自己常用的編輯器的說明文件,看看它是否支持這個(gè)功能。
對(duì)于已經(jīng)存在 BOM 的 UTF-8 文件,比如說就是微軟“記事本”弄出來的,我們可以利用 UltraEdit 來將 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”菜單將文件轉(zhuǎn)換成本地編碼,通常是GB2312碼,然后再使用“ASCII TO UTF-8(UNICODE Editing)”來轉(zhuǎn)換到 UTF-8 即可。當(dāng)然,這么操作之前,你肯定得先保證,你的 UltraEdit 保存出來的 UTF-8 文件的確是不帶 BOM 的。
Subversion 為什么討厭 BOM 呢?我不知道,畢竟我也只是一個(gè)普通用戶,不是開發(fā)人員。如果你感興趣,并且英文夠好的話,不妨參考一下這個(gè)討論: http://subversion.tigris.org/servlets/ReadMsg?list=users&msgNo=51334
6 參考文獻(xiàn)Subversion官方文檔, http://svnbook.red-bean.com
Subversion 1.3變更記錄, http://subversion.tigris.org/svn_1.3_releasenotes.html
Subversion FAQ, http://subversion.tigris.org/faq.html
UTF-8 常見問題, http://unicode.org/faq/utf_bom.html
7 歷史軌跡2006.06.04, v0.1
在 http://iusesvn.com/bbs 首次發(fā)布
2006.07.07, v0.4
加入 www.woodpecker.org.cn 的 OBP 項(xiàng)目
2006.10.11, v0.5
修正部分錯(cuò)誤,調(diào)整部分章節(jié)順序
2006.12.05, v1.0
添加“權(quán)限簡(jiǎn)介”一節(jié)
調(diào)整“實(shí)戰(zhàn)”章的章節(jié)順序,添加一些說明,使之更具可讀性
刪除一些與 apache 服務(wù)器相關(guān)的說明
添加“目錄表示法”一小節(jié)
重寫了“authz.conf 之項(xiàng)目子目錄”一小節(jié)
轉(zhuǎn)貼地址:http://m.tkk7.com/apple0668/archive/2007/10/30/157060.html
另外:
我在官方文檔上找到這樣一句話:
The thing to remember is that the most specific path always matches first. The server tries to match the path itself, and then the parent of the path, then the parent of that, and so on. The net effect is that mentioning a specific path in the access file will always override any permissions inherited from parent directories.
也就是說,權(quán)限認(rèn)證時(shí),SVN服務(wù)器會(huì)先去校驗(yàn)訪問目錄本身,如果通過,再去檢驗(yàn)上一級(jí)目錄,如果再通過,再去檢驗(yàn)上上級(jí)目錄,以此類推,一直到庫(kù)的根目錄,都通過才算是檢驗(yàn)權(quán)限成功!