基於路徑的授權

Apache和svnserve都可以給用戶賦予(或拒絕)訪問許可,通常是對整個版本庫:一個用戶可以讀版本庫(或不),而且他可以寫版本庫(或不)。如果可能,也可以定義細粒度的訪問規則。一組用戶可以有版本庫的一個目錄的讀寫權限,但是沒有其它的;另一個目錄可以是只對一少部分用戶可讀。

兩種伺服器都使用同樣的文件格式描述路徑為基礎的規則,如果是Apache,需要加載mod_authz_svn模塊,然後新增AuthzSVNAccessFile指示(在文件httpd.conf中)指明你的規則文件。(完全解釋可以看「每目錄訪問控制」一節。)如果你在使用svnserve,你需要讓你的authz-db變數(在svnserve.conf中)指向規則文件。

當你的伺服器知道去查找規則文件時,就是需要定義規則的時候了。

訪問文件的語法與svnserve.conf和運行中設定文件非常相似,以(#)開頭的行會被忽略,在它的簡單形式裡,每一小節命名一個版本庫和一個裡面的路徑,認證用戶名是在每個小節中的選項名,每個選項的值描述了用戶訪問版本庫的級別:r(只讀)或者rw(讀寫),如果用戶沒有提到,訪問是不允許的。

具體一點:這個小節的名稱是[repos-name:path]或者[path]的形式,如果你使用SVNParentPath指示,指定版本庫的名字是很重要的,如果你漏掉了他們,[/some/dir]部分就會與/some/dir的所有版本庫匹配,如果你使用SVNPath指示,因此在你的小節中只是定義路徑也很好—畢竟只有一個版本庫。

[calc:/branches/calc/bug-142]
harry = rw
sally = r

在第一個例子裡,用戶harrycalc版本庫中/branches/calc/bug-142具備完全的讀寫權利,但是用戶sally只有讀權利,任何其他用戶禁止訪問這個目錄。

當然,訪問控制是父目錄傳遞給子目錄的,這意味著我們可以為Sally指定一個子目錄的不同訪問策略:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

# give sally write access only to the 'testing' subdir
[calc:/branches/calc/bug-142/testing]
sally = rw

現在Sally可以讀取分支的testing子目錄,但對其他部分還是只可以讀,同時,Harry對整個分支還繼續有完全的讀寫權限。

也可以通過繼承規則明確的的拒絕某人的訪問,只需要設定用戶名參數為空:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

[calc:/branches/calc/bug-142/secret]
harry =

在這個例子裡,Harry對bug-142目錄樹有完全的讀寫權限,但是對其中的secret子目錄沒有任何訪問權利。

需要記住的是最詳細的的路徑會被匹配,伺服器首先找到匹配自己的目錄,然後父目錄,然後父目錄的父目錄,就這樣繼續下去,更具體的路徑控制會覆蓋所有繼承下來的訪問控制。

預設情況下,沒有人對版本庫有任何訪問,這意味著如果你已經從一個空文件開始,你會希望給所有用戶對版本庫根目錄具備讀權限,你可以使用星號(*)實現,用來代表「所有用戶」:

[/]
* = r

這是一個普通的設定;注意在小節名中沒有提到版本庫名稱,這讓所有版本庫對所有的用戶可讀。當所有用戶對版本庫有了讀權利,你可以賦予特定用戶對特定子目錄的rw權限。

星號(*)參數需要在這裡詳細強調:這是匹配匿名用戶的唯一模式,如果你已經設定了你的Location區塊允許匿名和認證用戶的混合訪問,所有用戶作為Apache匿名用戶開始訪問,mod_authz_svn會在要訪問路徑的定義中查找*值;如果找不到,Apache就會要求真實的客戶端認證。

訪問文件也允許你定義一組的用戶,很像Unix的/etc/group文件:

[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane

組可以被賦予通用戶一樣的訪問權限,使用「at」(@)前綴來加以區別:

[calc:/projects/calc]
@calc-developers = rw

[paint:/projects/paint]
@paint-developers = rw
jane = r

組中也可以定義為包含其它的組:

[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = @calc-developers, @paint-developers


[44] 本書的共同主題!