這學期教了svn怎麼使用,其中,老師出了作業要我們架兩個repository:
- 一個設為公開,所有人都有access的權限,但只能read。
- 一個設為非公開,必須先登入才能access這個repository,此外,不同帳號登入有不同的權限。
我在權限的地方被折騰了很久,所以一定要筆記一下以免老了忘記Orz…
安裝Apache
裝apache的步驟就不囉唆了
sudo apt-get update
sudo apt-get install apache2
安裝SVN
sudo apt-get install subversion
因為authentication與authorization我打算也讓apache負責,所以要再額外安裝相關的模組
sudo apt-get install libapache2-mod-svn libapache2-svn libsvn-dev
裝好後啟用剛剛裝的模組,然後重啟apache
sudo a2enmod dav
sudo a2enmod dav_svn
sudo a2enmod authz_svn
sudo service apache2 restart
建立Repository
這篇就拿老師叫我們做的作業要求來當示範好了
建立一個公開的、一個私人的repository
先在家目錄開個資料夾給svn,然後切換目錄
mkdir ~/svn
cd ~/svn
進去後創兩個repository,公開的我就叫PublicRepo,非公開需要驗證的就叫PrivateRepo
svnadmin create PublicRepo
svnadmin create PrivateRepo
因為整個svn資料夾包括兩個repository都是以目前使用者的身份建立的
而我們的目標是透過apache提供的網頁服務(http)進行存取
所以要讓apache有權限存取svn這個資料夾(以及裡面的repository)
sudo chown -R www-data:www-data ./
sudo chmod -R 775 ./
第一條指令將資料夾以及其所有檔案的擁有者改成apache的預設執行身份www-data
第二條指令將資料夾以及其所有檔案的權限改成擁有者跟擁有者所屬群組可以讀、寫、執行
除了上述以外其他人的權限只能讀跟執行
為非公開的Repository建立使用者名單
還記得我們要將第二個repository設為非公開
現在我們要來建立能合法登入的使用者名單
sudo htpasswd -cm /etc/apache2/dav_svn.passwd user1
最後面的user1是合法登入的使用者名稱,能改成自己想要的,之後系統會提示為使用者輸入密碼
如果想要新增第二、第三個使用者也是同一條指令,但是記得讓參數留下-m
就好
sudo htpasswd -m /etc/apache2/dav_svn.passwd user2
參數說明:
- -c 代表create,當檔案不存在時會創立一個新的檔案;當檔案存在時會從頭覆蓋過去,這就是為什麼第二個以上的使用者請不要加這個參數
-
-m 使用md5的方式雜湊密碼
設立兩個Repository的權限
做完authentication,換authorization
建立一個空的文字檔,準備在裡面加入兩個repository的access規則
touch /etc/apache2/dav_svn.authz
然後用自己習慣的編輯器在新建的dav_svn.authz
裡面加入以下內容:
[PublicRepo:/]
* = r
[PrivateRepo:/]
user1 = rw
user2 = rw
語法說明:
PublicRepo或PrivateRepo是repository的名稱,看自己的repository叫什麼名字就打什麼
接著冒號後的/
是指等等所給定的權限,適用於以repository為主的所有資料夾及檔案
如果你想要設定不是整個repository的權限,而是更細分的話,可以在這邊給定
下面* = r
、user1 = rw
跟user2 = rw
的部分則是設定權限
等號左邊放使用者的名稱或群組(為求簡單,這篇暫不介紹群組)
像第一個PublicRepo的*
就是wildcard,亦指所有的人
等號右邊則是權限,r
是read,w
是write
如果寫成* =
,則代表所有人都沒有權限
設定Apache
萬事俱備,只欠東風,我們目前有:
- 兩個repository
- 能存取的使用者與密碼檔
- 登入後的各個repository存取權限
現在只差讓apache託管我們的svn了
用自己熟悉的編輯器開啟/etc/apache2/mods-enabled/dav_svn.conf
移到檔案最尾端,加入以下內容:
<Location /svn/PublicRepo>
DAV svn
SVNPath /home/自己帳號使用者的名稱目錄/svn/PublicRepo
AuthzSVNAccessFile /etc/apache2/dav_svn.authz
</Location>
<Location /svn/PrivateRepo>
DAV svn
SVNPath /home/自己帳號使用者的名稱目錄/svn/PrivateRepo
AuthName "PrivateRepo"
AuthType Basic
AuthUserFile /etc/apache2/dav_svn.passwd
AuthzSVNAccessFile /etc/apache2/dav_svn.authz
Require valid-user
</Location>
因為有兩個repository,且有各自的權限,所以會寫成兩段
第一行<Location /svn/PublicRepo>
是指從網路存取時,接在主機位址後的路徑
像是/svn/PublicRepo
就可以透過http://主機位址/svn/PublicRepo
存取
DAV svn
的DAV是Distributed Authoring and Versioning的縮寫,當然後面接著的是本章主角svn
SVNPath
很好理解,要填上我們的repository資料夾的路徑
AuthzSVNAccessFile
是剛剛設定兩個repository權限檔案dav_svn.authz
位置
第一個repository是公開的,不須登入即可瀏覽,但所有人只有唯讀的權限,因此設定這幾項就好
第二個repository還要搭配我們的使用者密碼檔案dav_svn.passwd
做驗證,因此會多以下幾個參數
AuthName
是驗證時會顯示給使用者看的提示
AuthType
有Basic
跟Digest
可以選,這邊為了求功課交差了事簡單,就用Basic
就好
AuthUserFile
填上我們的用htpasswd
建立的使用者密碼檔案dav_svn.passwd
路徑
最後的Require valid-user
,只有完成上述所有認證的使用者才能access我們的repository
SVN Checkout 測試
既然是apache,那就先試試能不能網頁瀏覽建立的repository吧
PublicRepo
可以的~
PrivateRepo
不錯,驗證的功能有出來
帳密可以順利登入,完美~
接下來換用svn試試
PublicRepo
checkout正常
無法commit,權限設定正常
PrivateRepo
喔喔,出現要打帳號密碼了
PrivateRepo也checkout正常
試試commit
成功~