Subversion的權限控制

如有轉發請註明出處:http://www.subversion.org.cn/index.php?option=com_content&task=view&id=84&Itemid=9

在閱讀本文之前,請確定你已經知道了Subversion基本的服務器管理,知道了svnserve或Apache的配置,清楚如何設置用戶和密碼。關於svnserve的配置可以看我們的《Subversion快速入門教程》和《用Apache 和Subversion 搭建安全的版本控制環境》,對於一些細節情參考《使用Subversion進行版本控制》。

作爲一個配置管理員,需要管理用戶的權限,本文主要介紹了使用Subversion的授權文件“authz-db”,同時爲了敘述的清晰,我首先澄清一些概念。

1,認證(Authentication)和授權(Authorization)

這兩個術語經常一起出現。其中認證的意思就是鑑別用戶的身份,最常見的方式就是使用用戶名和密碼,授權就是判斷用戶是否具備某種操作的權限,在Subversion裏提供了“authz-db”文件,實現了以路徑爲基礎的授權,也就是判斷用戶是否有操作對應路徑的權限,在Subversion 1.3之後,svnserve和Apache一樣都可以使用“authz-db”文件。


2. svnserve下的配置文件

因爲本文是以svnserve爲例的,所以先介紹一下版本庫目錄的結構:

D:/SVNROOT/PROJECT1
├─conf
├─dav
├─db
│  ├─revprops
│  ├─revs
│  └─transactions
├─hooks
└─locks

其中conf下面有三個文件:

    authz
    passwd
    svnserve.conf

其中的“svnserve.conf”是這個版本庫的配置文件,當使用svnserve時,這個配置文件決定了使用什麼認證和授權文件:

    password-db = passwd
    authz-db = authz

上面的配置說明使用“svnserve.conf”同目錄的passwd和authz,其中的password-db指定了用戶密碼文件,authz-db是我們的授權文件,也就是我們本文主要介紹的文件。

注意:使用Apache作爲服務器時,根本就不會參考“svnserve.conf”文件的內容,而是會參考Apache的配置。


3,基於svnserve的版本庫文件佈局

使用svnserve時,爲了管理的方便,應該使用相同的認證和授權文件,所以應該讓所有版本庫的配置文件svnserve.conf指向同一個password-db和authz-db文件。下面是一個多版本庫的目錄:
D:/SVNROOT
├─project1
│  ├─conf
│  ├─dav
│  ├─db
│  │  ├─revprops
│  │  ├─revs
│  │  └─transactions
│  ├─hooks
│  └─locks
└─project2
    ├─conf
    ├─dav
    ├─db
    │  ├─revprops
    │  ├─revs
    │  └─transactions
    ├─hooks
    └─locks
   
D:/SVNROOT下有兩個目錄project1和project2,都已經創建了版本庫,所以我們修改每個conf目錄下的svnserve.conf,使之指向同一個password-db和authz-db文件。

password-db = ../../passwd
authz-db = ../../authz

這樣,D:/SVNROOT/passwd和D:/SVNROOT/authz就控制了所有版本庫的svnserve訪問。另外在後面的操作中要關閉匿名訪問,應該去掉“anon-access = none”前的“#”號,保證只有認證用戶可以訪問。

注意:還有一點需要注意,那就是svnserve的“realm”的值,在上面的設置下,應該保證所有的版本庫使用相同的realm值,這樣,對版本庫的密碼緩存可以在多個版本庫之間共享,更多細節見客戶端憑證緩存

4,測試用戶和組說明

版本庫禁止任何匿名用戶的訪問,只對認證用戶有效。

root:配置管理管理員,對版本庫有完全的管理權限。

p1_admin1:project1的管理員,對project1有完全權限。
p1_d1:project1的開發者,對project1的trunk有完全的權限,但是對其中的/trunk/admin目錄沒有任何權限。
p1_t1:project1的測試者,對project1的trunk有完全的讀權限,但是對其中的/trunk/admin目錄沒有任何權限。

p2_admin1:project2的管理員,對project2有完全權限。
p2_d1:project2的開發者,對project2的trunk有完全的權限,但是對其中的/trunk/admin目錄沒有任何權限。
p2_t1:project2的測試者,對project2的trunk有完全的讀權限,但是對其中的/trunk/admin目錄沒有任何權限。


對應的組及組的用戶:
p1_group_a:p1_admin1
p1_group_d:p1_d1
p1_group_t:p1_t1
p2_group_a:p2_admin1
p2_group_d:p2_d1
p2_group_t:p2_t1


5,修改D:/SVNROOT/passwd文件

前面已經說過了,用戶和密碼文件應該是在D:/SVNROOT/passwd,所以我們爲每一位用戶設置權限,文件內容如下:

[users]
p1_admin1 = p1_admin1
p1_d1 = p1_d1
p1_t1 = p1_t1
         
p2_admin1 = p2_admin1
p2_d1 = p2_d1
p2_t1 = p2_t1

爲了便於驗證,所有密碼和用戶名一致,如果你使用的是其他認證方式,這一步可能不同,但是用戶名應該都是一樣的。

6,配置授權,修改D:/SVNROOT/authz

[groups]
# 定義組信息

p1_group_a = p1_admin1
p1_group_d = p1_d1
p1_group_t = p1_t1

p2_group_a = p2_admin1
p2_group_d = p2_d1
p2_group_t = p2_t1


[/]
# 指定所有的版本庫默認只讀,root可讀寫
* = r
root = rw


[project1:/]
# 指定對版本庫project1根目錄的權限
@p1_group_a = rw
@p1_group_d = rw
@p1_group_t = r

[project1:/trunk/admin]
# 指定對版本庫project1的/trunk/admin根目錄的權限,
# p1_group_a讀寫,p1_group_d和p1_group_t沒有任何權限。
@p1_group_a = rw
@p1_group_d =
@p1_group_t =

 

[project2:/]
# 指定對版本庫project2根目錄的權限
@p2_group_a = rw
@p2_group_d = rw
@p2_group_t = r

[project2:/trunk/admin]
# 指定對版本庫project1的/trunk/admin根目錄的權限
@p2_group_a = rw
@p2_group_d =
@p2_group_t =


經過以上設置以後,你會發現一些有趣的事情。當使用用戶“p1_d1”,檢出project1的trunk時,目錄是空的,好像admin目錄根本不存在一樣,當使用p1_d1用戶瀏覽版本庫時,能夠看到admin目錄,但是其中的內容卻無法看到。

關於中文目錄,也是沒有問題的,只是注意要把authz文件轉化爲UTF-8格式,在我的WINXP的UltraEdit裏顯示的文件格式爲U8-DOS,具體的做法是用UltraEdit打開authz文件,然後選擇“文件->轉換->ASCII轉UTF-8”,然後保存。

再複雜的情況也不過如此,在實際的工作中要首先規劃好權限,只賦給用戶最小的權限,保證以最小的配置實現最複雜的權限控制。

 

 原文地址 http://www.subversion.org.cn/index.php?option=com_content&task=view&id=84&Itemid=9
 
發佈了27 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章