如何通过 WebSVN 限制存储库访问?

kay*_*oll 8 permissions svn apache-2.2

我有多个 Subversion 存储库,它们通过 Apache 2.2 和 WebDAV 提供。它们都位于一个中心位置,我以这篇debian-administration.org文章为基础(尽管我放弃了对简单 htpasswd 文件使用数据库身份验证)。

从那时起,我也开始使用WebSVN。我的问题是并非系统上的所有用户都应该能够访问不同的存储库,并且 WebSVN 的默认设置是允许任何可以进行身份​​验证的人。

根据 WebSVN 文档,解决这个问题的最好方法是使用 subversion 的路径访问系统,所以我希望使用 AuthzSVNAccessFile 指令来创建它。

但是,当我这样做时,我不断收到“403 Forbidden”消息。

我的文件如下所示:

我在文件中有默认策略设置:

<Location /svn/>
  DAV svn
  SVNParentPath  /var/lib/svn/repository

  Order deny,allow
  Deny from all
</Location>
Run Code Online (Sandbox Code Playgroud)

每个存储库都有一个如下所示的策略文件:

<Location /svn/sysadmin/>
    Include  /var/lib/svn/conf/default_auth.conf
    AuthName "Repository for sysadmin"
    require user joebloggs jimsmith mickmurphy
</Location>
Run Code Online (Sandbox Code Playgroud)

default_auth.conf 文件包含以下内容:

SVNParentPath      /var/lib/svn/repository
AuthType           basic
AuthUserFile       /var/lib/svn/conf/.dav_svn.passwd
AuthzSVNAccessFile /var/lib/svn/conf/svnaccess.conf
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么我需要 default_auth.conf 中的第二个 SVNParentPath,但我今天刚刚添加了它,因为我因为添加 AuthzSVNAccessFile 指令而收到错误消息。

使用完全许可的访问文件

[/]
joebloggs = rw
Run Code Online (Sandbox Code Playgroud)

系统运行良好(并且基本上没有变化),但是当我开始尝试添加任何类型的限制时,例如

[sysadmin:/]
joebloggs = rw
Run Code Online (Sandbox Code Playgroud)

相反,我再次收到“权限被拒绝”错误。日志文件条目是:

[Thu May 28 10:40:17 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET websvn:/
[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET svn:/sysadmin
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能让它发挥作用?是不是apache配置错了,还是我对svnaccess.conf文件的理解有误?

如果我以错误的方式解决这个问题,我对我的整体方法没有特别的依恋,所以也可以随意提供替代方案。

更新(20090528-1600):

我试图实现这个答案,但我仍然无法让它正常工作。

我知道大部分配置是正确的,因为我已经添加

[/]
joebloggs = rw
Run Code Online (Sandbox Code Playgroud)

在开始时,'joebloggs' 然后拥有所有正确的访问权限。

当我尝试去特定于存储库时,做一些类似的事情

[/]
joebloggs = rw

[sysadmin:/]
mickmurphy = rw
Run Code Online (Sandbox Code Playgroud)

然后我收到了 mickmurphy 的权限被拒绝错误(joebloggs 仍然有效),错误类似于我之前已经遇到的错误

[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'mickmurphy' GET svn:/sysadmin
Run Code Online (Sandbox Code Playgroud)

另外,我之前忘了解释我所有的存储库都在下面

/var/lib/svn/repository
Run Code Online (Sandbox Code Playgroud)

更新(20090529-1245):

仍然没有运气让它工作,但所有的迹象似乎都指向了subversion中的路径访问控制无法正常工作的问题。我的假设是我没有配置 apache 或 svn 来正确识别我的存储库结构。

这是因为 '[/]' 条目似乎工作得很好。

我也想到这个问题可能更适合 StackOverflow?

更新(20090603-1740):

作为对这个问题的评论之一的回应,我为 subversion 本身设置的 WebDAV 的位置为 /svn/ repos,但 websvn 设置为 /websvn。

Ale*_*x J 5

该问题可能与两个位置指令之间的配置拆分有关,但我不确定。

与其在两个地方(apache 配置和 authz 文件)定义权限,不如在 authz 文件中定义它们。像这样:

配置文件

<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn/repository

  Require valid-user
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /path/to/.htpasswd

  SVNPathAuthz on
  AuthzSVNAccessFile /path/to/svn.authz
</Location>
Run Code Online (Sandbox Code Playgroud)

svn.authz

[groups]
sysadmins = joebloggs jimsmith mickmurphy

# By default, nobody has any permissions
[/]
* = 

# sysadmins get access to the sysadmin repository
[sysadmin:/]
@sysadmins = rw
Run Code Online (Sandbox Code Playgroud)

显然,您还需要 htpasswd 文件中的适当用户。