如何通过WebSVN限制版本库访问?

我有多个通过Apache 2.2和WebDAV服务的Subversion版本库。 他们都位于一个中心位置,我用这个debian-administration.org文章作为基础(虽然我放弃了使用数据库身份validation一个简单的htpasswd文件虽然)。

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

根据WebSVN文档,最好的解决方法是使用Subversion的path访问系统,所以我打算使用AuthzSVNAccessFile指令创build它。

当我这样做的时候,我总是收到“403禁止”的消息。

我的文件如下所示:

我有一个文件中的默认策略设置:

<Location /svn/> DAV svn SVNParentPath /var/lib/svn/repository Order deny,allow Deny from all </Location> 

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

 <Location /svn/sysadmin/> Include /var/lib/svn/conf/default_auth.conf AuthName "Repository for sysadmin" require user joebloggs jimsmith mickmurphy </Location> 

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 

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

有完全宽容的访问文件

 [/] joebloggs = rw 

系统工作正常(基本上没有变化),但是当我开始尝试添加任何types的限制时,例如

 [sysadmin:/] joebloggs = rw 

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

 [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 

我需要做些什么才能使这个工作? configuration了apache错误,或者是我对svnaccess.conf文件的理解不正确?

如果我这样做的方式不对,我对整体方法没有特别的依恋,所以随时提供替代scheme。

更新(20090528-1600):

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

我知道大部分的configuration是正确的,正如我已经添加的

 [/] joebloggs = rw 

在开始和'joebloggs'然后有所有正确的访问。

当我尝试去存储库特定的,虽然,做一些像

 [/] joebloggs = rw [sysadmin:/] mickmurphy = rw 

那么我得到了mickmurphy的一个权限被拒绝的错误(joebloggs仍然有效),错误类似于我以前已经有的

 [Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'mickmurphy' GET svn:/sysadmin 

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

 /var/lib/svn/repository 

更新(20090529-1245):

仍然没有运气得到这个工作,但所有的迹象似乎指出了在颠覆path访问控制不正常工作的问题。 我的假设是,我没有configurationApache或SVN来正确识别我的存储库结构。

这是因为“[/]”条目似乎完美。

我也觉得这是StackOverflow上可能属于更好的问题?

更新(20090603-1740):

为了回应这个问题的一个意见,我的Subversion本身的WebDAV设置被赋予位置/ svn / repos,但是websvn被设置为/ websvn。

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

而不是在两个地方定义权限(apacheconfiguration和authz文件),只需在authz文件中定义它们。 像这样:

httpd.conf文件

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

svn.authz

 [groups] sysadmins = joebloggs jimsmith mickmurphy # By default, nobody has any permissions [/] * = # sysadmins get access to the sysadmin repository [sysadmin:/] @sysadmins = rw 

显然你也需要htpasswd文件中的相应用户。

不知道你是否已经解决了这个问题,但这是适合我的程序。

忘记摆弄apache指令,而是编辑WebSVN的config.php文件,并包含/取消注释以下指令:

组$ config-> useAuthenticationFile( '/path/到/你/ AuthZ的/文件');

这对我有用。

user1可以看到“/”和“/ project1”user3只能看到“/ project1”

[组]

组群=用户1,用户2

groupb = user3,user4

[/]

@groupa = rw

[/ PROJECT1]

@groupb = rw

我已经挣扎了很多,唯一对我有用的configuration是:

 Authz file ------ [groups] group1=user1 group2=user2 #Read and write for everyone defined in some group, others denied [/] @group1=rw @group2=rw *= [project1:/] @group1=rw *= [project2:/] @group2=r *= ----end authz file 

因此,group1具有对project1的读写权限,而group2具有对project2的读权限。 其他人无法访问任何项目。

我应该强调,“project1”和“project2”是在Apacheconfiguration文件subversion.conf定义的库中的项目。

 Subversion.conf ---- LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /svn> DAV svn SVNParentPath /var/www/svn AuthType Basic AuthName "Name of the root repositories" Require valid-user </Location> <Location /svn/repos> AuthName "Subversion subrepository" AuthUserFile /var/www/svn/repos/conf/passwdfile #Authz control AuthzSVNAccessFile /var/www/svn/repos/conf/authz </Location> -----end 

我目前的问题是,根本无法在repository /svn/repos中列出项目(尽pipe可以正确访问它们)。 SVNListParentPath on指令,无论你把它放在哪里,都没有帮助。

目前我的/var/www/svn不是一个存储库,而只是一个服务器文件系统中的一个目录。 /var/www/svn/repos是使用svnadmin create的存储库

你应该已经阅读了websvn文件,一切都将是显而易见的:)

另请注意,您不应该使用AuthzSVNAccessFile命令来定义访问文件。

现在您已经定义了身份validation,您将被要求input用户名和密码以访问WebSVN目录。 剩下的就是configurationWebSVN来使用你的Subversion访问文件来控制访问。 将这行添加到你的config.php文件中:

组$ config-> useAuthenticationFile( '/path/到/ accessfile');