更新時間:2021-12-21 11:23:16 來源:動力節點 瀏覽3624次
有不少剛開始學習Java的小伙伴對SVN的權限配置還不是很了解,本章將詳細介紹SVN權限配置涉及的兩個配置文件, svnserve.conf 和 authz.conf,通過對配置逐行的描述,來闡明其中的一些細節含義。
這里首先要注意一點,任何配置文件的有效配置行,都 **不允許存在前置空格** ,否則程序可能會出錯,給你一個 ``Option expected`` 的提示。也就是說,如果你直接從本文的純文本格式中拷貝了相關的配置行過去,需要手動將前置的4個空格全部刪除。當然了,如果你覺得一下子要刪除好多行的同樣數目的前置空格是一件苦差使,那么也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助。
1.svnserve.conf
``SVN\conf\svnserve.conf`` 文件,是 svnserve.exe 這個服務器進程的配置文件,我們逐行解釋如下。
首先,我們告訴 svnserve.exe,用戶名與密碼放在passwd.conf 文件下。當然,你可以改成任意的有效文件名,比如默認的就是 passwd:
password-db = passwd.conf
接下來這兩行的意思,是說只允許經過驗證的用戶,方可訪問代碼庫。那么哪些是“經過驗證的”用戶呢?噢,當然,就是前面說那些在 passwd.conf 文件里面持有用戶名密碼的家伙。這兩行的等號后面,目前只允許read write none 三種值,你如果想實現一些特殊的值,比如說“read-once”之類的,建議你自己動手改源代碼,反正它也是自由軟件:
anon-access = none
auth-access = write
接下來就是最關鍵的一句呢,它告訴 svnserve.exe,項目目錄訪問權限的相關配置是放在 authz.conf 文件里:
authz-db = authz.conf
當然,svn 1.3.2 引入本功能的時候,系統默認使用 authz 而不是 authz.conf 作為配置文件。
上述的 passwd.conf 和 authz.conf 兩個文件也可以作為多個代碼庫共享使用,我們只要將它們放在公共目錄下,比如說放在 ``D:\svn`` 目錄下,然后在每個代碼庫的 svnserve.conf 文件中,使用如下語句:
password-db = ..\..\passwd.conf
authz-db = ..\..\authz.conf
或者
password-db = ../../passwd.conf
authz-db = ../../authz.conf
這樣就可以讓多個代碼庫共享同一個用戶密碼、目錄控制配置文件,這在有些情況下是非常方便的。
2.authz.conf 之用戶分組
``SVN\conf\authz.conf``文件的配置段,可以分為兩類, ``[group]`` 是一類,里面放置著所有用戶分組信息。其余以 ``[SVN:/]`` 開頭的是另外一類,每一段就是對應著項目的一個目錄,其目錄相關權限,就在此段內設置。
首先,我們將人員分組管理,以便以后由于人員變動而需要重新設置權限時候,盡量少改動東西。我們一共設置了5個用戶分組,分組名稱統一采用 ``g_`` 前綴,以方便識別。當然了,分組成員之間采用逗號隔開:
[groups]
# 任何想要查看所有文檔的非本部門人士
g_vip = morson
# 經理
g_manager = michael
# 北京辦人員
g_beijing = scofield
# 上海辦人員
g_shanghai = lincon
# 總部一般員工
g_headquarters = rory, linda
# 小秘,撰寫文檔
g_docs = linda
注意到沒有, linda 這個帳號同時存在“總部”和“文檔員”兩個分組里面,這可不是我老眼昏花寫錯了,是因為 Subversion 允許我這樣設置。它意味著,這個家伙所擁有的權限,將會比他的同事rory 要多一些,這樣的確很方便。具體多了哪些呢?請往下看!
3.authz.conf 之項目根目錄
接著,我們對項目根目錄做了限制,該目錄只允許SVN事業部的經理才能修改,其他人都只能眼巴巴的看著:
[SVN:/]
@g_manager = rw
* = r
- ``[SVN:/]`` 表示這個目錄結構的相對根節點,或者說是 SVN 項目的根目錄。其中的SVN 字樣,其實就是代碼庫的名稱,即前面用 svnadmin create命令創建出來的那個 SVN。
- 這里的 ``@`` 表示接下來的是一個組名,不是用戶名。因為目前 g_manager 組里面只有一個 michael,你當然也可以將 ``@g_manager = rw`` 這一行替換成 ``michael = rw``,而表達的意義完全一樣。
- ``*`` 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部門經理外的其他所有人”,當然也包括總經理那個怪老頭
- ``* = r`` 則表示“那些人只能讀,不能寫”
4.authz.conf 之項目子目錄
然后,我們要給總部人員開放日志目錄的讀寫權限:
[SVN:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
這個子目錄的設置有些特色,因為從需求分析中我們知道,這個子目錄的權限范圍要比其父目錄小,它不允許除指定了的之外其他任何人訪問。在這段設置中,我們需要注意以下幾點:
設計svn的家伙們,大部分都是在類 unix 平臺下工作,所以他們總喜歡使用 ``/`` 來標識子目錄,而完全忽視在 MS Windows 下是用 ``\`` 來做同樣的事情。所以這兒,為了表示``diary\headquarters`` 這個目錄,我們必須使用 ``[SVN:/diary/headquarters]``這樣的格式。當然如果你一定要用 ``\`` ,那么唯一的結果就是,Subversion 會將你的這部分設置置之不理,全當沒看到。
這里最后一行的 ``* =`` 表示,除了經理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?不行,因為 **權限具備繼承性** ,子目錄會自動擁有父目錄的權限。若沒有這一行,則所有帳號都可以讀取 ``/diary/headquarters`` 目錄下的文件。因為雖然我們并沒有設置這個目錄的父目錄權限,可是默認的規則使得 ``/diary`` 目錄的權限與根目錄完全一樣,從而讓其余帳號獲得對``/diary/headquarters`` 目錄的 r 權限。所以簡單來說, ``* =`` 這一句的目的,就是割斷權限繼承性,使得管理員可以定制某個目錄及其子目錄的權限,從而完全避開其父目錄權限設置的影響。
之所以這兒需要將 ``@g_vip = r`` 一句加上,就是因為存在上述這個解釋。如果說你沒有明確地給總經理授予讀的權力,則他會和其他人一樣,被 ``* =`` 給排除在外。
如果眾位看官中間,有誰玩過防火墻配置的話,可能會感覺上述的配置很熟悉。不過這里有一點與防火墻配置不一樣,那就是各個配置行之間,沒有 **先后順序** 一說。也就是說,如果將本段配置的 ``* =`` 這一行挪到最前面,完全不影響整個配置的最終效果。
接下來我們看看這一段:
[SVN:/ref]
@g_manager = rw
@g_docs = rw
* = r
這里的主要看點,就是 g_docs 組里面包含了一個 linda 帳號,她也同時在 g_headquarters 組里面出現,這就意味著, linda 將具備對 ``/ref`` 和 ``diary\headquarters`` 兩個目錄的讀寫權限。
6.authz.conf 之目錄表示法
在前面的描述中,我們都采用 ``[repos:/some/dir]`` 這樣的格式來表示項目的某個目錄,實際上,Subversion允許你采用 ```[/some/dir]`` 這樣的格式,即不指定代碼庫的方式來表示目錄,此時的目錄就匹配所有項目。
對于使用 svnserve 的用戶來說,只有當 svnserve 運行的時候使用了 ``-r`` 參數,并且讓多個代碼庫共享同一個目錄權限文件(即 authz.conf 或 authz)時,不指明代碼庫名稱才有可能惹麻煩。一般情況下,我們對每個代碼庫都會獨立使用配置文件,畢竟每個項目的目錄結構,都有很大不同,混在一起意義不大。因此一般來說,為簡潔起見,都可以不指明代碼庫名稱。本文全都指明了代碼庫名稱,主要是為了將來擴展成同一個配置文件,以方便配合 Apache 服務器。
對于使用 Apache 的用戶來說,它們二者可有著很大的不同,因為此時往往習慣于使用一個公共的目錄權限配置文件。如果你使用了 SVNParentPath 指令,則指定版本庫的名字是很重要的,因為假若你使用后者,那么 ``[/some/dir]`` 部分就會與所有代碼庫項目的``[/some/dir]`` 目錄匹配。如果你使用 SVNPath 指令,則這兩種表示方式就沒有什么區別了,畢竟只有一個版本庫。大家如果想了解更多相關知識,可以關注一下動力節點的Java在線學習,里面的內容更加豐富,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習