Subversion 全部或全部访问 repo 树

Subversion 全部或全部访问 repo 树

我在 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

但是以用户 A 的身份检出 URL/svn/repoA 会导致禁止访问。

将其更改为

[/]
* =
userA = r

[/repoA]
* =
userA = rw

[/repoB]
* =
userB = rw

授予用户 A 对所有存储库(包括 repoB)的读取权限,但仅授予对 repoA 的读取权限!

因此为了让用户 A 获得对 repoB 的读写权限,我需要添加

[/]
userA = rw

这是精神上的。

我也尝试过改变

 Require valid-user

 Require user userA

对于 subversion.conf 中的 repoA,但这只给了我对它的读取权限。

我需要一种方法来默认拒绝每个人访问每个存储库,只有在明确定义时才授予读/写访问权限。

有人能告诉我我做错了什么吗?我花了几个小时测试和谷歌搜索,但一无所获,所以现在我发了这篇令人羞耻的帖子。

编辑

我采用了 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

答案1

您所遇到的问题的共同点是您的[/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 目标权限:

    [/]
    * =
    userA = r
    
    [repoA:/]
    * =
    userA = rw
    
    [repoB:/]
    * =
    userB = rw
    
  2. 对每个存储库使用不同的 authz 文件,记住授予访问权限的路径是相对于存储库的根目录的。

答案2

哇哦。首先,我会将 svn-auth.conf(和 svn-access.conf)从 apache 明确提供 http 请求的目录中删除。一些恶意的人会来请求该文件,并且他已经知道了你的一半安全问题,而无需尝试。

https://stackoverflow.com/questions/81361/how-to-setup-access-control-in-svn我认为这个答案似乎涵盖了您正在寻找的内容。

答案3

你搞混了每个存储库一个项目结构与基于路径的授权形式。

相关内容