也可以使用Apache的httpd模塊mod_authz_svn更加細(xì)致的設(shè)置訪問權(quán)限,這個模塊收集客戶端傳遞過來的不同的晦澀的URL信息,詢問mod_dav_svn來解碼,然后根據(jù)在配置文件定義的訪問政策來裁決請求。
如果你從源代碼創(chuàng)建Subversion,mod_authz_svn會自動附加到mod_dav_svn,許多二進(jìn)制分發(fā)版本也會自動安裝,為了驗證它是安裝正確,確定它是在httpd.conf
的LoadModule
指示中的mod_dav_svn后面:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
為了激活這個模塊,你需要配置你的Location
區(qū)塊的AuthzSVNAccessFile
指示,指定保存路徑中的版本庫訪問政策的文件。(一會兒我們將會討論這個文件的格式。)
Apache非常的靈活,你可以從三種模式里選擇一種來配置你的區(qū)塊,作為開始,你選擇一種基本的配置模式。(下面的例子非常簡單;見Apache自己的文檔中的認(rèn)證和授權(quán)選項來查看更多的細(xì)節(jié)。)
最簡單的區(qū)塊是允許任何人可以訪問,在這個場景里,Apache決不會發(fā)送認(rèn)證請求,所有的用戶作為“匿名”對待。
在另一個極端,你可以配置為拒絕所有人的認(rèn)證,所有客戶端必須提供證明自己身份的證書,你通過Require valid-user
指示來阻止無條件的認(rèn)證,并且定義一種認(rèn)證的手段。
第三種流行的模式是允許認(rèn)證和匿名用戶的組合,舉個例子,許多管理員希望允許匿名用戶讀取特定的版本庫路徑,但希望只有認(rèn)證用戶可以讀(或者寫)更多敏感的區(qū)域,在這個設(shè)置里,所有的用戶開始時用匿名用戶訪問版本庫,如果你的訪問控制策略在任何時候要求一個真實的用戶名,Apache將會要求認(rèn)證客戶端,為此,你可以同時使用Satisfy Any
和Require valid-user
指示。
一旦你的基本Location
區(qū)塊已經(jīng)配置了,你可以創(chuàng)建一個定義一些授權(quán)規(guī)則的訪問文件。
訪問文件的語法與svnserve.conf和運行中配置文件非常相似,以(#
)開頭的行會被忽略,在它的簡單形式里,每一小節(jié)命名一個版本庫和一個里面的路徑,認(rèn)證用戶名是在每個小節(jié)中的選項名,每個選項的值描述了用戶訪問版本庫的級別:r
(只讀)或者rw
(讀寫),如果用戶沒有提到,訪問是不允許的。
具體一點:這個小節(jié)的名稱是[repos-name:path]
或者[path]
的形式,如果你使用SVNParentPath
指示,指定版本庫的名字是很重要的,如果你漏掉了他們,[/some/dir]
部分就會與/some/dir
的所有版本庫匹配,如果你使用SVNPath
指示,因此在你的小節(jié)中只是定義路徑也很好—畢竟只有一個版本庫。
[calc:/branches/calc/bug-142]
harry = rw
sally = r
在第一個例子里,用戶harry
對calc
版本庫中/branches/calc/bug-142
具備完全的讀寫權(quán)利,但是用戶sally
只有讀權(quán)利,任何其他用戶禁止訪問這個目錄。
當(dāng)然,訪問控制是父目錄傳遞給子目錄的,這意味著我們可以為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
現(xiàn)在Sally可以讀取分支的testing
子目錄,但對其他部分還是只可以讀,同時,Harry對整個分支還繼續(xù)有完全的讀寫權(quán)限。
也可以通過繼承規(guī)則明確的的拒絕某人的訪問,只需要設(shè)置用戶名參數(shù)為空:
[calc:/branches/calc/bug-142]
harry = rw
sally = r
[calc:/branches/calc/bug-142/secret]
harry =
在這個例子里,Harry對bug-142
目錄樹有完全的讀寫權(quán)限,但是對secret
子目錄沒有任何訪問權(quán)利。
有一件事需要記住的是需要找到最匹配的目錄,mod_authz_svn模塊首先找到匹配自己的目錄,然后父目錄,然后父目錄的父目錄,就這樣繼續(xù)下去,更具體的路徑控制會覆蓋所有繼承下來的訪問控制。
缺省情況下,沒有人對版本庫有任何訪問,這意味著如果你已經(jīng)從一個空文件開始,你會希望給所有用戶對版本庫根目錄具備讀權(quán)限,你可以使用*
實現(xiàn),用來代表“所有用戶”:
[/]
* = r
這是一個普通的設(shè)置;注意在小節(jié)名中沒有提到版本庫名稱,這讓所有版本庫對所有的用戶可讀,不管你是使用SVNPath
或是SVNParentPath
。當(dāng)所有用戶對版本庫有了讀權(quán)利,你可以賦予特定用戶對特定子目錄的rw
權(quán)限。
星號(*
)參數(shù)需要在這里詳細(xì)強調(diào):這是匹配匿名用戶的唯一模式,如果你已經(jīng)配置了你的Location
區(qū)塊允許匿名和認(rèn)證用戶的混合訪問,所有用戶作為Apache匿名用戶開始訪問,mod_authz_svn會在要訪問路徑的定義中查找*
值;如果找不到,Apache就會要求真實的客戶端認(rèn)證。
訪問文件也允許你定義一組的用戶,很像Unix的/etc/group
文件:
[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane
組可以被賦予通用戶一樣的訪問權(quán)限,使用“at”(@
)前綴來加以區(qū)別:
[calc:/projects/calc]
@calc-developers = rw
[paint:/projects/paint]
@paint-developers = rw
jane = r
...并且非常接近。