我有多个通过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');