Apache-2.2

顛覆對 repo 樹的全部或全部訪問

  • September 7, 2012

我在 Linux 伺服器上設置對我的 Subversion 儲存庫的訪問時遇到了一些問題。問題是我似乎只能得到一個全有或全無的結構。要麼每個人都獲得對所有內容的讀取權限,要麼沒有人獲得對任何內容的讀取或寫入權限。

設置:

SVN 儲存庫位於 /www/svn/repoA,repoB,repoC…

儲存庫由 Apache 提供,位置在 etc/httpd/conf.d/subversion.conf 中定義為:

<Location /svn/repoA>
DAV svn
SVNPath /var/www/svn/repoA
AuthType Basic
AuthName "svn repo"
AuthUserFile /var/www/svn/svn-auth.conf
AuthzSVNAccessFile /var/www/svn/svn-access.conf
Require valid-user
</Location>

<Location /svn/repoB>
DAV svn
SVNPath /var/www/svn/repoB
AuthType Basic
AuthName "svn repo"
AuthUserFile /var/www/svn/svn-auth.conf
AuthzSVNAccessFile /var/www/svn/svn-access.conf
Require valid-user
</Location>

...

svn-access.conf 設置為:

[/]
* =

[/repoA]
* =
userA = rw

[/repoB]
* =
userB = rw

但是將 URL/svn/repoA 作為 userA 簽出會導致訪問被禁止。

將其更改為

[/]
* =
userA = r

[/repoA]
* =
userA = rw

[/repoB]
* =
userB = rw

授予 userA 對所有儲存庫(包括 repoB)的讀取訪問權限,但僅授予對 repoA 的讀取訪問權限!

所以為了讓 userA 獲得對 repoB 的讀寫訪問權限,我需要添加

[/]
userA = rw

這是精神上的。

我也試過改變

Require valid-user

Require user userA

對於 subversion.conf 中的 repoA,但這只給了我對它的讀取權限。

我需要一種預設拒絕所有人訪問每個儲存庫的方法,僅在明確定義時才授予讀/寫訪問權限。

誰能告訴我我在這裡做錯了什麼?我已經花了幾個小時進行測試和Google搜尋,但結果都是空的,所以現在我正在做恥辱的文章。

編輯

我選擇了 Shane 的第一個解決方案,最終得到了以下工作配置:

/etc/httpd/conf.d/subversion.conf:

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn

   AuthType Basic
   AuthName "Subversion repo"
   AuthUserFile /var/svn-auth.conf
   Require valid-user
</Location>

/var/svn-access.conf:

[/]
* =

[repoA:/]
* =
userA = rw

[repoB:/]
* =
userB = rw

您遇到的問題的共同主題是您的[/repoA][/repoB]部分什麼都不做,對嗎?這是有原因的。

您授權的路徑與 authz 訪問文件的位置*無關;*它們與它處理訪問控制的 SVN 儲存庫有關。

那麼,你的[/]部門?它授予對/svn/repoA/和的訪問權限/svn/repoB/;它不授予/svn/. 同樣,您的[/repoA]部分授予對/svn/repoA/repoA和的訪問權限/svn/repoB/repoA;的規則[/trunk]將授予對/svn/repoA/trunk和的訪問權限/svn/repoB/trunk

您已經SVNPath為每個儲存庫設置了指令,但您為每個儲存庫指向相同的授權文件 - 因此每個儲存庫都有相同的訪問規則。有一種語法可以為不同的儲存庫設置不同的授權,但那是在你使用SVNParentPath.

所以,有兩個選擇:

  1. 切換到使用SVNParentPath /var/www/svn而不是在 Apache 配置中硬定義每個 repo,並將 authz 文件更改為具有 repo-targeted 權限:
[/]
* =
userA = r

[repoA:/]
* =
userA = rw

[repoB:/]
* =
userB = rw
  1. 為每個儲存庫使用不同的 authz 文件,請記住,授予訪問權限的路徑是相對於儲存庫的根目錄的。

引用自:https://serverfault.com/questions/423826