posts - 19,  comments - 123,  trackbacks - 0

          1???背景假設(shè)

          廈門(mén)央瞬公司是一家電子元器件設(shè)備供應(yīng)商,其中有個(gè)ARM部門(mén),專(zhuān)門(mén)負(fù)責(zé)ARM芯片的方案設(shè)計(jì)、銷(xiāo)售,并在北京、上海各設(shè)立了一個(gè)辦事處。對(duì)于工作日志,原先采用郵件方式發(fā)給經(jīng)理,但是這種方式有個(gè)缺點(diǎn),那就是不具備連續(xù)性,要看以前的日志必須一封一封郵件去查看,很麻煩。于是就想到利用 Subversion, 讓員工在自己電腦上編輯日志,然后利用svn傳送回來(lái),既方便員工自己編寫(xiě)日志,又方便對(duì)日志的歸檔處理,而且提交日志的時(shí)候只需要執(zhí)行一下 svn update 即可,比發(fā)送郵件還要簡(jiǎn)單的多。

          • svn服務(wù)器相關(guān)信息

            • 服務(wù)器地址: 192.168.0.1
            • 服務(wù)器OS: MS Windows 2000 Server Edition 中文版
            • 代碼庫(kù)本地目錄: D:\svn\arm
          • arm部門(mén)文檔的目錄結(jié)構(gòu)如下:

            arm                 部門(mén)名稱(chēng)
            ├─diary           工作日志目錄
            │  ├─headquarters    總部工作日志目錄
            │  ├─beijing         北京辦日志目錄
            │  └─shanghai        上海辦日志目錄
            ├─ref             公司公共文件參考目錄
            └─temp            臨時(shí)文件目錄
            
          • 人員情況

            • morson,公司總經(jīng)理,其實(shí)他不必親自看任何東西,就連部門(mén)經(jīng)理們的每周總結(jié)都不一定看。但是為了表示對(duì)他的尊敬,以及滿(mǎn)足一下他的權(quán)力欲,還是給他開(kāi)放了“閱讀所有文檔”的權(quán)限
            • michael,arm事業(yè)部的部門(mén)經(jīng)理,沒(méi)事的時(shí)候喜歡弄點(diǎn)兒新技術(shù),用svn來(lái)管理日志,就是他相處來(lái)的主意
            • scofield,北京辦人員,老員工,為人油滑難管
            • lincon,上海辦人員,老員工,大老實(shí)人一個(gè)
            • linda,總部協(xié)調(diào)員、秘書(shū),文筆不錯(cuò),長(zhǎng)得也不錯(cuò)
            • rory,單片機(jī)技術(shù)員,技術(shù)支持
          • 訪問(wèn)權(quán)限需求分析

            • 允許總經(jīng)理讀取所有文件
            • 除部門(mén)經(jīng)理外,所有其他人員,均只能看到本辦事處人員工作日志
            • 不允許匿名訪問(wèn)
            • ref目錄只允許經(jīng)理和秘書(shū)寫(xiě),對(duì)其他人只讀
            • temp目錄人人都可以寫(xiě)

          2???建立代碼庫(kù)

          在服務(wù)器 D:\svn 目錄下,建立 arm 代碼庫(kù),命令如下:

          D:\svn>svnadmin create arm
          

          在客戶(hù)機(jī) F:\temp 目錄下,建立好上述目錄結(jié)構(gòu)

          用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導(dǎo)入結(jié)構(gòu)

          【注意點(diǎn):關(guān)于導(dǎo)入時(shí)候的細(xì)微差別】

          3???編輯代碼庫(kù)基礎(chǔ)配置文件

          編輯代碼庫(kù) arm\conf\svnserve.conf 文件,如下:

          [general]
          password-db = passwd.conf
          anon-access = none
          auth-access = write
          authz-db = authz.conf
          

          4???管理用戶(hù)帳號(hào)

          新建代碼庫(kù) arm\conf\passwd.conf 文件,如下:

          [users]
          morson = ShowMeTheMoney
          michael = mysecretpassword
          scofield = hellolittilekiller
          lincon = asyouknows111
          rory = 8809117
          linda = IlikeWorldCup2006
          

          5???建立目錄訪問(wèn)權(quán)限控制文件

          新建代碼庫(kù) 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
          

          6???測(cè)試

          在服務(wù)器上,打開(kāi)一個(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 deni”

          深入

          本章將詳細(xì)介紹前一章所涉及的兩個(gè)配置文件, svnserve.conf 和 authz.conf,通過(guò)對(duì)配置逐行的描述,來(lái)闡明其中的一些細(xì)節(jié)含義。

          這里首先要注意一點(diǎn),任何配置文件的有效配置行,都不允許存在前置空格,否則程序會(huì)無(wú)法識(shí)別。也就是說(shuō),如果你直接從本文的純文本格式中拷貝了相關(guān)的配置行過(guò)去,需要手動(dòng)將前置的4個(gè)空格全部刪除。當(dāng)然了,如果你覺(jué)得一下子要?jiǎng)h除好多行的同樣數(shù)目的前置空格是一件苦差使,那么也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助呢。

          1???svnserve.conf

          arm\conf\svnserve.conf 文件,是 svnserve.exe 這個(gè)服務(wù)器進(jìn)程的配置文件,我們逐行解釋如下。

          首先,我們告訴 svnserve.exe,用戶(hù)名與密碼放在 passwd.conf 文件下。當(dāng)然,你可以改成任意的有效文件名,比如默認(rèn)的就是 passwd:

          password-db = passwd.conf
          

          接下來(lái)這兩行的意思,是說(shuō)只允許經(jīng)過(guò)驗(yàn)證的用戶(hù),方可訪問(wèn)代碼庫(kù)。 那么哪些是“經(jīng)過(guò)驗(yàn)證的”用戶(hù)呢?噢,當(dāng)然,就是前面說(shuō)那些在 passwd.conf 文件里面持有用戶(hù)名密碼的家伙。這兩行的等號(hào)后面,目前只允許 read write none 三種值,你如果想實(shí)現(xiàn)一些特殊的值,比如說(shuō)“read-once”之類(lèi)的,建議你自己動(dòng)手改源代碼,反正它也是自由軟件:

          anon-access = none
          auth-access = write
          

          接下來(lái)就是最關(guān)鍵的一句呢,它告訴 svnserve.exe,項(xiàng)目目錄訪問(wèn)權(quán)限的相關(guān)配置是放在 authz.conf 文件里:

          authz-db = authz.conf
          

          當(dāng)然,svn 1.3.2 引入本功能的時(shí)候,系統(tǒng)默認(rèn)使用 authz 而不是 authz.conf 作為配置文件。不過(guò)由于鄙人是處女座的,有著強(qiáng)烈的完美主義情結(jié),看著 svnserve.conf 有后綴而 passwd 和 authz 沒(méi)有就是不爽,硬是要改了。

          2???authz.conf 之用戶(hù)分組

          arm\conf\authz.conf 文件的配置段,可以分為兩類(lèi),``[group]`` 是一類(lèi),里面放置著所有用戶(hù)分組信息。其余以 [arm:/] 開(kāi)頭的是另外一類(lèi),每一段就是對(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è)用戶(hù)分組,分組名稱(chēng)統(tǒng)一采用 g_ 前綴,以方便識(shí)別。當(dāng)然了,分組成員之間采用逗號(hào)隔開(kāi):

          [groups]
          # 任何想要查看所有文檔的非本部門(mén)人士
          g_vip = morson
          # 經(jīng)理
          g_manager = michael
          # 北京辦人員
          g_beijing = scofield
          # 上海辦人員
          g_shanghai = lincon
          # 總部一般員工
          g_headquarters = rory, linda
          # 小秘,撰寫(xiě)文檔
          g_docs = linda
          

          注意到?jīng)]有, linda 這個(gè)帳號(hào)同時(shí)存在“總部”和“文檔員”兩個(gè)分組里面,這可不是我老眼昏花寫(xiě)錯(cuò)了,是因?yàn)?svnserve.exe 允許我這樣設(shè)置。它意味著,這個(gè)家伙所擁有的權(quán)限,將會(huì)比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請(qǐng)往下看!

          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),或者說(shuō)是 arm 項(xiàng)目的根目錄
          • 這里的 @ 表示接下來(lái)的是一個(gè)組名,不是用戶(hù)名。你當(dāng)然也可以將 @g_manager=rw 這一行替換成 michael=rw ,而表達(dá)的意義完全一樣。
          • * 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部門(mén)經(jīng)理外的其他所有人”,當(dāng)然也包括總經(jīng)理那個(gè)怪老頭
          • * = r 則表示“那些人只能讀,不能寫(xiě)”

          4???authz.conf 之項(xiàng)目子目錄

          然后,我們要給總部人員開(kāi)放日志目錄的讀寫(xiě)權(quán)限:

          [arm:/diary/headquarters]
          @g_manager = rw
          @g_headquarters = rw
          @g_vip = r
          * =
          
          • 我敢打賭,設(shè)計(jì)svn的家伙們,大部分都是在 unix/linux 平臺(tái)下工作,所以他們總喜歡使用 / 來(lái)標(biāo)識(shí)子目錄,而完全忽視在 MS Windows 下是用 \ 來(lái)做同樣的事情。所以這兒,為了表示 arm\diary\headquarters 這個(gè)目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。
          • 這里最后一行的 *= 表示,除了經(jīng)理、總部人員、特別人士之外,任何人都被禁止訪問(wèn)本目錄。這一行是否可以省略呢?
          • 之所以這兒需要將 @g_vip=r 一句加上,就是因?yàn)榇嬖谏鲜鲞@個(gè)解釋。如果說(shuō)你沒(méi)有明確地給總經(jīng)理授予讀的權(quán)力,則他會(huì)和其他人一樣,被 * 給排除在外。
          • 如果眾位看官中間,有誰(shuí)玩過(guò)防火墻配置的話,可能會(huì)感覺(jué)上述的配置很熟悉。不過(guò)這里有一點(diǎn)與防火墻配置不一樣,那就是各個(gè)配置行之間,沒(méi)有 先后順序 一說(shuō)。也就是說(shuō),如果我將本段配置的 *= 這一行挪到最前面,完全不影響整個(gè)配置的最終效果。
          • 請(qǐng)注意這兒,我們并沒(méi)有給 arm\diary 目錄設(shè)置權(quán)限,就直接跳到其子目錄下進(jìn)行設(shè)置了。我當(dāng)然是故意這樣的,因?yàn)槲蚁朐谶@兒引入“繼承”的概念。
          • 權(quán)限具備繼承性 任何子目錄,均可繼承其父目錄的所有權(quán)限,除非它自己被明確設(shè)置了其他的權(quán)限。也就是說(shuō),在 arm 目錄設(shè)置權(quán)限后, arm\diary 目錄沒(méi)有進(jìn)行設(shè)置,就意味著它的權(quán)限與 arm 目錄一樣,都是只有經(jīng)理才有權(quán)讀寫(xiě),其他人只能干瞪眼。
          • 【 * = 是否可以省略】【用例子引入覆蓋】【單用戶(hù)權(quán)限的繼承問(wèn)題】【父目錄權(quán)限集成與全面覆蓋問(wèn)題】

          現(xiàn)在來(lái)看看

          好了,我們現(xiàn)在掌握了“繼承”的威力,它讓我們節(jié)省了不少敲鍵盤(pán)的時(shí)間。可是現(xiàn)在又有一個(gè)問(wèn)題了,

          屬性具備覆蓋性質(zhì)子目錄若設(shè)置了屬性,則完全覆蓋父目錄。

          5???authz.conf 的其他注意點(diǎn)

          1. 父目錄的 r 權(quán)限,對(duì)子目錄 w 權(quán)限的影響

          把這個(gè)問(wèn)題專(zhuān)門(mén)提出來(lái),是因?yàn)樵?.3.1及其以前的版本里面,有個(gè)bug,即為了子目錄的寫(xiě)權(quán)限,項(xiàng)目首目錄必須具備讀權(quán)限。因此現(xiàn)在使用了1.3.2版本,就方便了那些想在一個(gè)代碼庫(kù)存放多個(gè)相互獨(dú)立的項(xiàng)目的管理員,來(lái)分配權(quán)限了。比如說(shuō)央舜公司建立一個(gè)大的代碼庫(kù)用于存放所有員工日志,叫做 diary,而arm事業(yè)部只是其中一個(gè)部門(mén),則可以這樣做:

          [diary:/]
          @g_chief_manager = rw
          [diary:/arm]
          @g_arm_manager = rw
          @g_arm = r
          

          這樣,對(duì)于所有arm事業(yè)部的人員來(lái)說(shuō),就可以將 svn://192.168.0.1/diary/arm 這個(gè)URL當(dāng)作根目錄來(lái)進(jìn)行日常操作,而完全不管它其實(shí)只是一個(gè)子目錄,并且當(dāng)有少數(shù)好奇心比較強(qiáng)的人想試著 checkout 一下 svn://192.168.0.1/diary 的時(shí)候,馬上就會(huì)得到一個(gè)警告“Access deni”,哇,太酷了。

          1. 默認(rèn)權(quán)限

          如果說(shuō)我對(duì)某個(gè)目錄不設(shè)置任何權(quán)限,會(huì)怎樣?馬上動(dòng)手做個(gè)試驗(yàn),將:

          [diary:/]
          @g_chief_manager = rw
          

          改成:

          [diary:/]
          # @g_chief_manager = rw
          

          這樣就相當(dāng)于什么都沒(méi)有設(shè)置。在我的 svn 1.3.2 版本上,此時(shí)是禁止任何訪問(wèn)。也就是說(shuō),如果你想要讓某人訪問(wèn)某目錄,你一定要顯式指明這一點(diǎn)。這個(gè)策略,看起來(lái)與防火墻的策略是一致的。

          1. 只讀權(quán)限帶來(lái)的一個(gè)小副作用

          若設(shè)置了:

          [arm:/diary]
          * = r
          

          則svnserve認(rèn)為,任何人,都不允許改動(dòng)diary目錄,包括刪除和改名,和新增。

          也就是說(shuō),如果你在項(xiàng)目初期創(chuàng)建目錄時(shí)候,一不小心寫(xiě)錯(cuò)目錄名稱(chēng),比如因拼寫(xiě)錯(cuò)誤寫(xiě)成 dairy,以后除非你改動(dòng) authz.conf 里面的這行設(shè)置,否則無(wú)法利用 svn mv 命令將錯(cuò)誤的目錄更正。

          改進(jìn)

          1???對(duì)中文目錄的支持

          上午上班的時(shí)候,Morson 來(lái)到 Michael 的桌子前面,說(shuō)道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺(jué)得很難受?” Michael 心想,還好這兩天剛了解了一些與 unicode 編碼相關(guān)的知識(shí),于是微笑地回答:“當(dāng)然可以,你明天下午就可以看到中文目錄名稱(chēng)了。”

          1. 使用 svn mv 指令,將原來(lái)的一些目錄改名并 commit 入代碼庫(kù),改名后的目錄結(jié)構(gòu)如下:

            arm
            ├─工作日志
            │  ├─總部人員
            │  ├─北京辦
            │  └─上海辦
            ├─公司公共文件參考目錄
            └─臨時(shí)文件存放處
            
          2. 修改代碼庫(kù)的 authz.conf 文件,將相應(yīng)目錄逐一改名

          3. 使用 UltraEdit 將 authz.conf 文件轉(zhuǎn)換成不帶 BOM 的 UTF-8 格式

            將配置文件轉(zhuǎn)換成 UTF-8 格式之后,Subversion 就能夠正確識(shí)別中文字符了。但是這里需要注意一點(diǎn),即必須保證 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的縮寫(xiě),指 UNICODE 文件頭部用于指明高低字節(jié)排列順序的幾個(gè)字符,通常是 FFFE ,而將之用 UTF-8 編碼之后,就是 EFBBBF 。由于 UTF-8 文件本身不存在字節(jié)序問(wèn)題,所以對(duì) UTF-16 等編碼方式有重大意義的 BOM,對(duì)于 UTF-8 來(lái)說(shuō),只有一個(gè)作用——表明這個(gè)文件是 UTF-8 格式。由于 BOM 會(huì)給文本處理帶來(lái)很多難題,所以現(xiàn)在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。

          目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”里面,“另存為”菜單保存出來(lái)的 UTF-8 格式文件,會(huì)自動(dòng)帶上 BOM 。新版本 UltraEdit 提供了選項(xiàng),允許用戶(hù)選擇是否需要 BOM,而老版本的不會(huì)添加 BOM。請(qǐng)各位查看一下自己常用的編輯器的說(shuō)明文件,看看它是否支持這個(gè)功能。

          利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”菜單將文件轉(zhuǎn)換成本地編碼,通常是GB2312碼,然后再使用“ASCII TO UTF-8(UNICODE Editing)”來(lái)轉(zhuǎn)換到 UTF-8 即可。

          ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 作者:鄭新星

          posted on 2006-09-05 14:55 韓淚 閱讀(12506) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): 開(kāi)發(fā)工具


          FeedBack:
          # re: 【轉(zhuǎn)貼】Subversion權(quán)限詳解
          2006-12-06 13:18 | 鄭新星
          你好,我是本文作者,無(wú)意中閑逛到你這兒的
          這篇文章有些舊,其中存在一些錯(cuò)誤,我已經(jīng)更新
          如果方便,請(qǐng)更新你的轉(zhuǎn)貼,以免讓錯(cuò)誤信息繼續(xù)流傳,謝謝
          (參見(jiàn) http://iusesvn.com/bbs/thread-6-1-1.html )  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)貼】Subversion權(quán)限詳解[未登錄](méi)
          2013-05-27 16:34 | Allen
          很詳細(xì),好理解!  回復(fù)  更多評(píng)論
            

          虛其心,可解天下之問(wèn); 專(zhuān)其心,可治天下之學(xué); 靜其心,可悟天下之理; 恒其心,可成天下之業(yè)。

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)(19)

          隨筆檔案(19)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 大洼县| 柳河县| 邵东县| 祁东县| 友谊县| 上思县| 惠东县| 峡江县| 禹城市| 辽宁省| 南乐县| 怀远县| 兴山县| 石林| 井研县| 清水县| 黄陵县| 舞钢市| 遵化市| 增城市| 吴忠市| 济南市| 同德县| 舞钢市| 大理市| 丰台区| 靖江市| 宜昌市| 德钦县| 延边| 大安市| 溧水县| 庐江县| 樟树市| 隆回县| 平原县| 公主岭市| 舟山市| 黄冈市| 嘉荫县| 西乌珠穆沁旗|